質問
コンパイラは、プログラマーが要求したかどうかにかかわらず、関数のインライン拡張を実行する場合と実行できない場合があります。
私は知りたいと思っていましたが、コンパイラーが特定の機能を象徴していることを確実に知ることができる方法はありますか?
解決
生成されたコードを見る以外に、いいえ。いくつかの実装はその情報を提供するかもしれませんが、標準では必須ではありません。
のようなもの inline
また register
(震え) 提案 コンパイラに、そして彼らを受け入れたり、無視したり、あなたの後ろにひそかに後ろに行ったりしたりしていないことをあなたに嘘をつくことができます:-)
コンパイラーは、コードから最もパフォーマンスを絞る方法よりもよく知っていると思うので、私はそのような機能を使用しない傾向があります。
他のヒント
コードをプロファイルして、対象の関数がコールスタックに表示されるかどうかを確認できます。ただし、スタックサンプリングレートが十分に高くない場合、保証はないと思います。
しかし、それはそれがインラインであることを証明するかもしれません:あなたが知っているなら A
電話 B
, 、呼び出します C
, 、 と A
決して電話しないでください C
直接、あなたが見るなら A
電話 C
コールスタックでは、ご存知のように B
その呼び出しのためにインラインドされました。
コンパイラを設定してアセンブラーコードを生成し、そこで確認します。
オブジェクトファイルの分解をお読みください。
出力アセンブラーを見る以外に知る方法はありません。
最近のコンパイラは「スマート」であり、インラインの機能とどのような場合にどのような機能を決定しますか。
レジスタキーワードと同じように、コンパイラは最近ピッキングを行い、リクエストを本当に無視します。
あなたが欲しいものを見つける方法はないと思います、
しかし、あなたは関数の可能性を増やすことができます。
関数の定義を、それが呼ばれる翻訳ユニットに見えるようにします。つまり、ヘッダーファイルにインライン関数の定義を常に配置する必要があります。