インライン関数の説明が簡易化できない
0
私はEffective C++でのinlineの説明をベースに以下の感じで言語化していました
少し長いので、簡単かと言われると微妙ですが。。。。
参考までに。。。
C++のinline関数は、コードの効率を上げるために便利な仕組みです。通常、関数を呼び出すと関数の定義にジャンプする処理が必要ですが、inline関数は呼び出し元にその関数のコードを直接展開するようにコンパイラに依頼します。これにより関数呼び出しのオーバーヘッドが削減され、実行速度が向上する可能性があります。
ただし、「タダの昼食はない」という言葉通り、注意が必要です。inline関数は、コードを呼び出し元に展開するため、関数の使用箇所が多いとプログラム全体のコードサイズが大きくなる可能性があります。コードが大きくなるとキャッシュの効率が下がり、逆にパフォーマンスが低下することも考えられます。
また、コンパイラがすべてのinline化リクエストに従うわけではありません。ループや再帰を含む関数や、仮想関数(virtual)など、特定の状況ではinline化が無効化される場合もあります。
簡単にまとめると、inlineは便利ですが万能ではなく、状況に応じた適切な使い方が求められるということです。
初期の仕様では inline
指定はインライン化を促す意図があったのは確かです。 言語設計者自身が著書の中で述べています。
しかし現代ではそうではないというところが inline
の説明をし難い部分です。 歴史的経緯を踏まえなければ意味が解りません。
C++ にはプログラム全体で「定義」はひとつとするルール (いわゆる ODR) があります。 しかしインライン化するためにはその翻訳単位中で定義がわかっている必要があり、 inline
指定が付けられた定義は ODR の例外とするルールによって辻褄合わせがされました。
後にインライン化の判断はコンパイラに任せたほうが効果的になり、また、リンク時最適化 (いわゆる LTO) が広く利用できるようになったので翻訳単位を跨ぐインライン化の判断も人が指定を付ける意味がそれほどありません。 実際、 inline
指定を付けてもインライン化しないことはよくありますし、 inline
指定がなくてもインライン化はそれなりに起こります。
今では inline
指定はインライン化をするためのものではなく (コンパイラが多少は判断の参考にすることはあります) ODR の例外であるという意味のほうが強くなりました。 プログラムの構成上、ヘッダに定義を書きたいときに使うものであるということです。
様々な事情から「実際に複雑である」ので簡単に説明できないのは仕方ないことだと思います。