6

C 语言允许在不向前看的情况下一次性读取源文件;在任何时候,编译器只需要考虑出现在文件当前位置之前的声明、原型、宏定义等。

这是否意味着要内联函数调用,编译器可能需要在调用之前定义函数?例如:

int foo(void);
int bar(void) { return foo(); }
inline int foo(void) { return 42; }

foo如果将内联定义移到 的定义前面,调用是否更有可能被内联bar

我是否应该在我的代码中安排内联定义,以便它们出现在最好内联的调用之前?或者我可以假设任何足够先进的优化编译器都可以进行内联,即使它出现在调用之后(这似乎是 gcc 的情况),也能够找到定义?

编辑:我注意到在带有该/Ob1选项的 Pelles C 中确实需要定义可见,然后才能内联调用。Compiler 还提供了一个/Ob2选项来消除此限制(并且还允许编译器在没有 inline 说明符的情况下内联函数,类似于 gcc 所做的),但文档指出使用第二个选项可能需要更多内存。

4

1 回答 1

3

在实践中应该没有任何区别。因为,它的编译器选择内联函数或不内联函数,即使它被明确告知inline. 编译器也可以内联一个函数,即使它是使用inline关键字定义的。

首先,我在gcc 4.6.3没有任何优化的情况下运行了您的代码:

$ gcc -fdump-ipa-inline test.c 

从生成的程序集中foobar即使foo是内联的,也不是内联的。当我更改将定义inline foo放在顶部时,编译器仍然没有内联两者。

接下来我做了同样的事情-O3

$ gcc -fdump-ipa-inline -O3 test.c 

现在这两个函数都是内联的。即使只有一个有inline声明。

基本上编译器可以在它认为合适的时候内联一个函数。

于 2012-08-21T20:15:54.020 回答