函数定义的顺序对C++中的内联很重要吗

Is the order of function definitions important for inlining in C++

本文关键字:定义 顺序 C++ 函数      更新时间:2023-10-16

当一个函数调用另一个函数,并且需要内联时,这两个函数定义的顺序重要吗?假设这两个定义出现在同一个翻译单元中。

我主要感兴趣的是C++标准对它的描述(如果有的话)。但是,如果您有关于特定编译器中内联行为的重要信息,我也会对此感兴趣。请假设没有发生链接时间优化(已禁用)。

具体来说,以下两个版本是否同样有可能根据C++标准实现内联?

版本一:

inline void foo() { ... }
void bar() { ... foo(); ... }

版本二:

inline void foo();
void bar() { ... foo(); ... }
void foo() { ... }

编辑:请注意,这个问题是关于inline关键字在实现一般内联方面的有效性的,而不是。我特别询问标准是否说明了函数定义的顺序与实现内联有关。

C++标准在这里不进行任何强制。编译器可以在他们认为合适的任何情况下自由内联或不内联。内联关键字除了允许对同一函数进行多个定义之外,可能没有任何效果。

大多数编译器将能够内联翻译单元可用的任何函数,而不管它在源中的出现顺序如何。正向声明通常只影响源文件中给定点上可用的名称,而不影响二进制文件的最终输出。

实际上,inline关键字与内联代码的关系不大,而与允许"违法行为";一个定义规则的。inline的主要目的是告诉编译器一个函数可能出现在多个翻译单元中(并且在每个翻译单元中都有相同的定义)。这使它能够避免在链接阶段出现多个定义错误。

使用inline关键字并不能保证编译器会内联函数——这只是一个建议。此外,如果在翻译单元中可以看到定义,并且编译器认为有价值,那么许多编译器将内联未标记为inline的函数。我强烈怀疑您给出的两个例子都会被某个特定的编译器内联或不内联。

简而言之,让编译器决定是否内联,并以最可读的方式编写代码。