在gcc
, 使用
-E
给出预处理后的代码;-S
,汇编代码;-c
,代码已编译,但未链接。
是否有任何接近 a 的东西-I
,可以让我查看函数是否已内联,即查看代码扩展,就好像内联函数是预处理宏一样?
如果没有,我应该通过汇编代码,还是稍后执行内联应用程序?
在gcc
, 使用
-E
给出预处理后的代码;-S
,汇编代码;-c
,代码已编译,但未链接。是否有任何接近 a 的东西-I
,可以让我查看函数是否已内联,即查看代码扩展,就好像内联函数是预处理宏一样?
如果没有,我应该通过汇编代码,还是稍后执行内联应用程序?
我认为检查汇编代码是查看内联内容的最佳(而且几乎是唯一)方法。
请记住,在某些情况下,某些内联可能会在链接时发生。请参阅链接器可以内联函数吗?
您可以使用该-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
不是命令, inline
函数与否(尽管声明为inline
)由编译器决定。It 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
。
这里的问题是,通常内联是链接时间优化(当有多个目标文件时),因为编译器在链接时间之前根本看不到其他目标文件中的函数实现。
因此,在多目标文件编译中,您最好的办法是检查生成的程序集,但是在每个目标文件中,内联是可能的,假设要内联的函数在同一个编译单元中,但是大多数编译器不这样做内联点,因为它不知道可以从哪里调用这个函数,以及它本身是否应该被内联。
因此,通常内联是在链接时执行的,但是对于非常小的函数,它可以而且应该在编译时完成。
我也相信,如果你用 clang/llvm 编译你的代码,你会得到带有内联的 ac 输出文件,虽然我还没有尝试过。
请注意,为了让 GCC 进行链接时间优化(包括内联),您必须为其提供一个参数,我认为它是 -flto。
另一种方法是让所有内联函数在所有编译单元中可见(例如在头文件中),这实际上通常会确保内联,以避免在不同的目标文件中多次声明同一函数。
检查程序集是否内联的一种简单方法是将源代码中对函数的调用次数与程序集中的调用次数进行比较。