プロが教えるわが家の防犯対策術!

VisualStudioを使用しています。
タイトルの通り、関数がインライン展開されているかどうかを確認したいのですが、何か方法はあるのでしょうか?

void func(){
int a = 0;
}

void main(){
func();
}
例えば、上のコードで関数func()がインライン展開されてるかどうかを知りたいと思います。
どうかよろしくお願いします。

A 回答 (4件)

>例えば、上のコードで関数func()がインライン展開されてるかどうかを知りたいと思います。


基本的にプロジェクトの設定によります。

分かりやすいよう以下のようなコードでコンパイルしVisual Studio 2005 Professionalで調べてみました。
int func(int a){
 return a + 2;
}
int main(){
 int b = func(2);
 return b;
}

release版(デフォルト設定)の場合、最適化されアセンブリコードはこのようなコードになりました。
mov eax,4
C++に書き直せば
int main(){
 return 4;
}
です。

Visual Studio 2005のrelease版(デフォルト設定:デバッグ情報入り)の場合
ブレークポイントを適当なところではり
メニュー → デバッグウインドウ → 逆アセンブル で見ることが出来ます。
※勿論確実なのは出来たバイナリを確認することです。

ちなみに最適化を無効(/Od)にすると最適化もされずインライン展開もされません。
インライン展開される為には
inline int func(int a){
 return a + 2;
}
とする必要があります。
    • good
    • 0
この回答へのお礼

詳細な説明をありがとうございます。
おかげさまで疑問は解決しました。

それにしても、この機能は便利ですね。
まさに今回のように一箇所だけ軽く調べたい時にぴったりな機能だと思いました。

お礼日時:2010/12/13 00:43

/Faオプションを指定するなどして、アセンブリ言語のソース(またはリスティングファイル)を出力させるのが一番確実でしょうね。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
アセンブリコードを見たい時は今まではコマンドプロンプトからclかdumpbinコマンドでファイル生成してました。
でも、こっちの方が何倍も楽で良いですね。
今度からいちいちコマンドプロンプトを開かなくて済みそうです、有益な情報ありがとうございます。

お礼日時:2010/12/13 00:59

マップファイルでも見る?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
初めてマップファイルという物を見てみましたけど、よく分からない部分も多く少し難しいと感じました。
ここから該当箇所がinlineされているかどうかを確認していくのは、私には骨の折れる作業になりそうです。
でもこういう機能もあるんですね、別の機会で使えるかもしれません。
勉強になりました、ありがとうございます。

お礼日時:2010/12/13 00:49

C++言語仕様の範囲でinline展開されているか否かを知るすべはありません。

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
言語仕様からの視点は全く頭になかったので勉強になりました。
つまりコンパイラ任せという事でしょうか、inlineを突き詰めて考えようとするとかなり面倒な事になりそうですね。

お礼日時:2010/12/13 00:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!