如何检查内联是否发生

时间:2011-05-19 09:29:26

标签: c++ c gcc

我想在我的项目中大量使用inline以加快效果。

据我所知,编译器可能内联或不适用;这取决于编译器。

我不清楚我能做些什么来实现这一目标,但在朝着这个方向发展之前,你是否知道一种方法来检查输出二进制文件中是否真的发生了inlinining?

5 个答案:

答案 0 :(得分:7)

使用gcc -Winline在未内联内联函数时收到警告。

使用__attribute__ ((always_inline))强制函数内联。

话虽如此,但如果你不明智地使用内联,请注意你可以搞砸性能,编译时间并获得巨大的代码膨胀。

答案 1 :(得分:7)

如果您使用的是MS编译器,则可能需要启用warning C4710以获取未内联函数的警告。

答案 2 :(得分:6)

使用gcc -S选项生成汇编程序输出,然后在您喜欢的文本编辑器中检查输出。

但是,编译器通常比内联更好地判断内联实际上会提高性能。不要太急于强迫它;描述你的代码,看看内联是否实际上更快。

答案 3 :(得分:1)

编译器可能比你更聪明,但忽略了这一点,假设你没有启用任何特殊的编译器标志,你可以转储名称列表并查找是否已生成该函数。

static int foo(int x)
{
  return(x*x);
}

main()
{
  int x=1;
  foo(x);
}

测试

not seth> gcc -o /tmp/foo /tmp/main1.c
not seth> nm /tmp/foo | grep foo
00000000004004c4 t foo
not seth> gcc -O -o /tmp/foo /tmp/main1.c
not seth> nm /tmp/foo | grep foo

答案 4 :(得分:0)

inline关键字实际上与优化无关。大多数编译器都会内联函数调用(函数本身可能必须单独编译,例如,如果你将其地址放在其他地方),无论inline关键字是否存在。

实际上,即使一个被调用的函数在另一个转换单元中,一个聪明的链接器也可以在链接时内联它(MSVC将此功能作为“链接时间代码生成”提供)。它需要编译器和链接器之间的强大合作。

inline关键字的 raison d'être是允许[非模板]功能打破单一定义规则,从而在头文件中定义。函数的实际内联将由编译器根据传递给它的各种启发式和优化标志来决定,而不是则基于inline关键字。

因此,大量使用inline可能绝对不会对性能产生任何影响。如果您担心性能问题,请使用分析器确定您的程序花费时间(通常是您不希望的时间),并通过优化实际瓶颈来采取相应措施。