何时在编译过程中内联函数

时间:2013-03-29 13:30:45

标签: c++ compiler-construction inline

gcc中,使用

  • -E提供预处理代码;
  • -S,汇编代码;
  • -c,代码已编译但未链接。

是否有任何接近-I的内容,这样我才能看到函数是否已内联,即看到扩展的代码,好像内联函数是预先准备好的宏?

如果没有,我应该通过汇编代码,还是稍后执行内联应用程序?

3 个答案:

答案 0 :(得分:2)

我认为检查汇编代码是查看内联内容的最佳方式(而且几乎是唯一的方法)。

请记住,在某些情况下,某些内联可以在链接时进行。见Can the linker inline functions?

答案 1 :(得分: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不是命令,无论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

答案 2 :(得分:-1)

这里的问题是通常内联是一个链接时间优化(当有多个目标文件时),因为编译器在链接时没有看到其他目标文件中函数的实现。

因此,在多目标文件编译中,最好的方法是检查生成的程序集,但是在每个单个目标文件中,内联是可能的,假设要内联的函数在同一个编译单元中,但是大多数编译器都不做在这一点上内联,因为它不知道可以从哪里调用这个函数,以及它本身是否应该被内联。

所以一般来说,内联是在链接上执行的,但对于非常小的函数,它可以而且应该在编译时完成。

另外我相信如果你用clang / llvm编译你的代码,你会得到一个内联的c输出文件,所以我没有尝试过。

请注意,为了让GCC进行链接时间优化(包括内联),你必须为它提供一个参数,我认为它是-flto。

另一种方法是在所有编译单元中显示所有内联函数(例如在头文件中),这实际上通常会确保内联,以避免在不同的目标文件中对同一函数进行多次声明。

检查程序集内联的简单方法是将源代码中函数的调用次数与程序集中的调用次数进行比较。