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