gpt4 book ai didi

c - 是否应该在调用之前定义内联函数?

转载 作者:太空狗 更新时间:2023-10-29 17:25:15 27 4
gpt4 key购买 nike

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

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

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

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

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

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

最佳答案

它在实践中应该没有任何区别。因为,它的编译器选择是否内联一个函数,即使它被明确告知 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 声明。

基本上,编译器可以根据需要内联一个函数。

关于c - 是否应该在调用之前定义内联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12061536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com