7

Up till a while a ago my code base was very close to #include hell. Every time I changed an even mildly important .h file practically all the files got recompiled.
The main reason for such high header dependency was that I have many small functions that need to be inline and I was under the impression that for inline to work they need to be in the same translation unit as the calling code, so they need to be in the header. For the inline function to even compile other headers need to be included in the header as well, ad infimum.

Enter link-time code generation (in Visual Studio). One of the main stated advantages of this is that now inline function can cross translation units.
But I'm still iffy. How can I really be sure that these functions really get inlined? I realize that the compiler can basically do whatever the hell it wants no matter where I define the function.

Is there a way to check what gets inlined?

4

5 に答える 5

7

C++ でこれを言うのはタブーであることはわかっていますが、関数をプリプロセッサ マクロとして実装することもできます。すみません、石鹸で口をすすぎます。

于 2009-04-02T18:41:45.987 に答える
3

確かに、物事がインライン化されるかどうかはあまり気にしません。パフォーマンスが満足できるものであるかどうかだけを気にします。しかし、本当に知りたい場合は、コンパイラが生成するコードを調べてください。これは、アセンブラ ビュー ウィンドウを使用して、デバッガで最も簡単に行うことができます。

于 2009-04-02T09:53:01.337 に答える
3

関数がインライン化されていることを確認することはできません。それを選択するのはコンパイラ次第です。ただし、関数に関連付けられたオブジェクト コードをコンパイラが見つけられるようにすることで、コンパイラをより簡単にすることができます。

そこで、リンク時のコード生成の出番です。コンパイラはオブジェクト コードを生成しなくなり、中間言語の形式を生成します。実際にコードをコンパイルするのはリンカーです。

何がインライン化されるかを確認するには、オブジェクト コードと共にアセンブリ出力を生成する必要があります。これにより、特定の関数を呼び出したときに生成される正確なオブジェクト コードを読み取ることができ、そこに「呼び出し」があるかどうかが非常に明確になります。

于 2009-04-02T09:54:36.713 に答える
3

比較的簡単な方法の 1 つは、プロファイラーを使用することです。関数がインライン化されている場合、制御グラフのフローには表示されません。

于 2009-04-02T09:58:27.563 に答える
1

実行可能ファイルを取得したら、ツールを使用してそれを検査し、シンボル テーブルでインライン化された関数の名前を探すことができます。そのような非常に便利なツールの 1 つがDependency Walkerです。

もちろん、これは、シンボルを保持しながら、コンパイラがインライン化に煩わされるのに十分な両方の最適化設定を組み合わせたビルドを取得できることを前提としています。

Visual Studio の場合、"Release" ビルドはそれらと一致することが多いと思いますが、完全にはわかりません。

于 2009-04-02T09:52:14.660 に答える