- 締切済み
インライン関数
インライン関数として認識されなくても、通常の関数として実行されるのなら、プログラムする際にはすべての関数にinlineと書けばいいと思います。 インライン関数を使えば実行速度が上がる。それなら何故コンパイラ側で通常の関数すべてをインライン関数として認識しないのかがわかりません。inlineと書く手間が省けるので。 lnline関数として認識しようとしたができず、通常の関数として実行する時は、通常の関数を普通に実行するときよりも実行速度が遅くなるのでしょうか?もし、遅くならないのならすべての関数をinline関数として書けばいいと思います。どうなんでしょうか?お願いします。
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
すべての関数をインライン置換して実行速度が向上するのは、キャッシュもなければMMUもない環境だけです。それ以外は、トリビアルな関数を除いて実行速度が向上するかどうかは一概にはいえません。 C言語の場合、C99でinlineが導入されるまで標準規格ではサポートしていなかったので、(処理系の独自拡張である)inlineは付けないのが普通です。また、C99のinlineは関数の呼び出し速度向上を示唆するためのキーワードであり、インライン置換を示唆するためのものではありません(C++のinlineとは意味が異なります)。 さらに、インライン関数は関数定義を各翻訳単位で行わなければなりません。通常ヘッダファイルに記述することになりますが、その場合、下手にマクロを使っていると、局所変数等が置換されてしまうリスクがあります。 また、ソースコードを必ず公開する必要があるため、商用ライブラリ等で支障が出る可能性があります。 最後に、(C99では)外部結合を持つインライン関数内でstatic付きのオブジェクトを宣言した場合の動作は未規定になるケースがあり、これを使いこなすのはそう簡単ではありません。
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
歴史的な経緯と、コードが肥大化すると言う問題があり、すべての関数をインライン関数として書く訳には行きません。 それに「汎用の関数の中身を書き換えた時」に、ソースが独立していれば「その関数だけコンパイルして、あとの部分は再コンパイルの必要が無い」と言うのも重要です。 インライン関数が書かれたヘッダファイルを書き換えた所為で、数千個あるソースファイルをすべて再コンパイル、なんて事になったら…(一部の人は「朝コンパイルし初めて、夕方にコンパイルし終わるまで、どっかでサボってる」なんて事を言い出しそうだ)
- postal0x02
- ベストアンサー率42% (24/57)
組み込み系プログラマ(新兵)です。 命令キャッシュの小さいCPUの話になりますが、 すべての関数に inline を付けたら速度が若干遅くなりました。 過去の業務ではあまり inline は見かけませんでした。 私の場合、実コードが1~2行ならば inline をつけていますが。 (もちろんマクロも使ってます)
お礼
遅くなっちゃうんですかー。
1.別々のインスタンスになったとき全体的に見て速いのか インライン展開するとそれぞれが別々のものとしてCPUにフェッチされる 1つなら読み込む容量も1つ分で済む 他のプリフェッチの邪魔にならない push/popも今時のCPUはワイヤード 2.GCCの-fstack-protectorやVC++の/GSはcallしてretする時にしか使えない 3.コンパイラが知ることの出来ない副作用 http://wiki.monaos.org/pukiwiki.php?cmd=read&page=%C4%F3%B0%C6%2F%C5%C5%B8%BB%B4%C9%CD%FD%2F%A5%AB%A1%BC%A5%CD%A5%EB%CD%EE%A4%C1%A4%F2%C4%B4%BA%BA%2Fsecondboot#s02756c9 4.バグ
- MrBan
- ベストアンサー率53% (331/615)
もともとのC言語にinlineという規定はなかったわけで、 デフォルト動作については互換性という名の歴史的経緯も大きいとおもいますが。 それ以外でも、既に上がっているようなトレードオフがあり、 全てinlineした方が嬉しい人もいれば、そうでない人もいます。 大きな関数がinline展開されると、逆にキャッシュから 外れやすくなって速度が落ちるケースもありますし…。 後は開発上で再コンパイルの範囲が膨れるなど、 一回フルコンパイルするだけで数時間以上というシステムなどでは 泣けることになることもあります。
- arain
- ベストアンサー率27% (292/1049)
>インライン関数を使えば実行速度が上がる。それなら何故コンパイラ側で通常の関数すべてをインライン関数として認識しないのかがわかりません。 「早くなる」という上辺だけの行為がすべて有益であるとは限りません。 インライン関数は、関数を呼び出すことはせず関数の処理コードを「内部展開」している分、関数の読み出しのためのオーパヘッドがなくなる分処理が高速化します。 しかし、「内部展開」している分コード量は増えることにより、プログラムサイズも肥大します。 また、常時使用するメモリ容量も増大するというデメリットも存在します。 特にメモリの使用量(実際のプログラムコードが記録されるROM領域も含む)は組み込み系では十分に注意しなければいけない部分です。
お礼
みなさんありがとうございました。