コンパイラは、プログラマが要求したかどうかにかかわらず、関数のインライン展開を実行する場合と実行しない場合があることを知っています。
知りたかったのですが、コンパイラーが特定の関数をインライン化したことをプログラマーが確実に知る方法はありますか?
6 に答える
生成されたコードを見る以外は、いいえ。一部の実装ではその情報が提供される場合がありますが、標準では必須ではありません。
inline
またはregister
(身震い)のようなものはコンパイラへの提案であり、それらを受け入れるか、無視するか、密かにあなたの後ろに隠れてそれをしない間にそれが行われたとあなたに嘘をつくことさえ自由です:-)
私はそのような機能を使用しない傾向があります。それは、多くの場合、コードから最大限のパフォーマンスを引き出す方法をコンパイラの方がよく知っていると思うからです。
コードをプロファイリングして、対象の関数がコール スタックに表示されるかどうかを確認できます。ただし、スタックのサンプリング レートが十分に高くない場合、保証はないと思います。
しかし、それがインライン化されていることを証明するかもしれません: が呼び出され、どれが を呼び出しA
、直接呼び出されないことがわかっている場合、コール スタックで呼び出しが見られれば、その呼び出しがインライン化されていることがわかります。B
C
A
C
A
C
B
アセンブラ コードを生成するようにコンパイラを設定し、そこでチェックします。
欲しいものを見つける方法はないと思いますが、
ただし、関数がインライン関数である可能性を高めるには、次のようにします。
関数の定義を、それが呼び出された翻訳単位から見えるようにします。つまり、常にインライン関数の定義をヘッダー ファイルに入れる必要があります。
オブジェクト ファイルの逆アセンブリを読み取ります。