dpi*_*dpi 6 c optimization inline
C语言允许在一次通过中读取源文件而无需向前看; 在任何时候,编译器只需要考虑在文件中当前位置之前出现的声明,原型,宏定义等.
这是否意味着对于要内联的函数调用,编译器可能需要在调用之前定义函数?例如:
int foo(void);
int bar(void) { return foo(); }
inline int foo(void) { return 42; }
Run Code Online (Sandbox Code Playgroud)
foo
如果内联定义在定义的前面移动,是否更有可能内联调用bar
?
我应该在我的代码中安排内联定义,以便它们出现在应该最好内联的调用之前吗?或者我可以假设任何高级足以进行内联的优化编译器都能够找到定义,即使它出现在调用之后(这似乎是gcc的情况)?
编辑:我注意到在Pelles C中,/Ob1
选项确实需要在内联调用之前显示定义.编译器还提供了一个/Ob2
删除此限制的选项(并且还允许编译器在没有内联说明符的情况下内联函数,类似于gcc所做的那样),但是文档声明使用第二个选项可能需要更多内存.
它在实践中应该没有任何区别。因为,即使明确告知它,编译器也可以选择内联或不内联函数inline
。编译器也可能内联函数,即使它是使用inline
关键字定义的。
首先,我在gcc 4.6.3
没有任何优化的情况下运行了您的代码:
$ gcc -fdump-ipa-inline test.c
Run Code Online (Sandbox Code Playgroud)
从生成的程序集中,尽管foo
已bar
内联,但 和 均未foo
内联。当我更改将定义放在inline foo
顶部时,编译器仍然没有内联两者。
接下来我做了同样的事情-O3
:
$ gcc -fdump-ipa-inline -O3 test.c
Run Code Online (Sandbox Code Playgroud)
现在这两个函数都被内联了。尽管只有一个人有inline
声明。
基本上编译器可以内联一个它认为合适的函数。