2

gcc、使用

  • -E前処理されたコードを与える;
  • -S、アセンブリ コード。
  • -c、コンパイルされたがリンクされていないコード。

-I関数がインライン化されているかどうか、つまり、インライン関数が前処理されたマクロであるかのようにコードが展開されているかどうかを確認できる、に近いものはありますか?

そうでない場合、アセンブリ コードを処理する必要がありますか?それともインライン アプリケーションは後で実行しますか?

4

3 に答える 3

2

何がインライン化されているかを確認するには、アセンブリ コードを調べるのが最善の (そしてほぼ唯一の) 方法だと思います。

特定の状況では、リンク時にインライン展開が発生する可能性があることに注意してください。リンカーは関数をインライン化できますか?を参照してください。

于 2013-03-29T13:33:51.630 に答える
1

このオプションを使用して-Winline、関数をインライン化できず、インラインとして宣言されているかどうかを確認できます。

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#Warning-Optionsから引用

-Winline Warn if a function that is declared as inline cannot be inlined. Even with this option, the compiler does not warn about failures to inline functions declared in system headers. The compiler uses a variety of heuristics to determine whether or not to inline a function. For example, the compiler takes into account the size of the function being inlined and the amount of inlining that has already been done in the current function. Therefore, seemingly insignificant changes in the source program can cause the warnings produced by -Winline to appear or disappear.

ただし、関数であるかどうかは ( として宣言されていますが)、コンパイラによって決定されるinlineコマンドではありません 。inlineinlineIt may consider the size of the function being inlined and how many times inline already been done in the current function.

関数が実際に実行されたかどうかを確認する最善の方法はinlined、アセンブリ コードを確認することです。たとえば、次のように使用できます。

gcc -O2 -S -c foo.c

のアセンブリ コードを生成しfoo.c、アセンブリ コード ファイルを出力しますfoo.s

于 2013-03-29T13:42:16.950 に答える
-1

ここでの問題は、一般にインライン化はリンク時の最適化 (複数のオブジェクト ファイルがある場合) であるということです。これは、コンパイラが他のオブジェクト ファイル内の関数の実装をリンク時まで認識しないためです。

したがって、マルチオブジェクトファイルのコンパイルでは、生成されたアセンブリを検査するのが最善の方法ですが、インライン化される関数が同じコンパイルユニットにあると仮定すると、すべてのオブジェクトファイル内でインライン化が可能ですが、ほとんどのコンパイラはこれでインライン化を行いませんこの関数がどこから呼び出されるか、それ自体をインライン化する必要があるかどうかがわからないためです。

そのため、一般にインライン化はリンク時に実行されますが、非常に小さな関数の場合は、コンパイル時に実行できますし、実行する必要があります。

また、clang/llvm を使用してコードをコンパイルすると、インライン化された ac 出力ファイルが得られると思いますが、試したことはありません。

GCC にリンク時の最適化 (インライン化を含む) を実行させるには、引数を指定する必要があることに注意してください。-flto だと思います。

別の方法は、すべてのコンパイル ユニット (ヘッダー ファイルなど) ですべてのインライン関数を表示することです。これにより、通常、異なるオブジェクト ファイルで同じ関数の複数の宣言を回避するために、インライン化が保証されます。

また、アセンブリのインライン化を簡単に確認するには、ソース コード内の関数の呼び出し数をアセンブリ内の呼び出し数と比較します。

于 2013-03-29T13:40:16.653 に答える