函数定义的顺序对C++中的内联很重要吗
Is the order of function definitions important for inlining in C++
当一个函数调用另一个函数,并且需要内联时,这两个函数定义的顺序重要吗?假设这两个定义出现在同一个翻译单元中。
我主要感兴趣的是C++标准对它的描述(如果有的话)。但是,如果您有关于特定编译器中内联行为的重要信息,我也会对此感兴趣。请假设没有发生链接时间优化(已禁用)。
具体来说,以下两个版本是否同样有可能根据C++标准实现内联?
版本一:
inline void foo() { ... }
void bar() { ... foo(); ... }
版本二:
inline void foo();
void bar() { ... foo(); ... }
void foo() { ... }
编辑:请注意,这个问题是关于inline
关键字在实现一般内联方面的有效性的,而不是。我特别询问标准是否说明了函数定义的顺序与实现内联有关。
C++标准在这里不进行任何强制。编译器可以在他们认为合适的任何情况下自由内联或不内联。内联关键字除了允许对同一函数进行多个定义之外,可能没有任何效果。
大多数编译器将能够内联翻译单元可用的任何函数,而不管它在源中的出现顺序如何。正向声明通常只影响源文件中给定点上可用的名称,而不影响二进制文件的最终输出。
实际上,inline
关键字与内联代码的关系不大,而与允许"违法行为";一个定义规则的。inline
的主要目的是告诉编译器一个函数可能出现在多个翻译单元中(并且在每个翻译单元中都有相同的定义)。这使它能够避免在链接阶段出现多个定义错误。
使用inline
关键字并不能保证编译器会内联函数——这只是一个建议。此外,如果在翻译单元中可以看到定义,并且编译器认为有价值,那么许多编译器将内联未标记为inline
的函数。我强烈怀疑您给出的两个例子都会被某个特定的编译器内联或不内联。
简而言之,让编译器决定是否内联,并以最可读的方式编写代码。
相关文章:
- c++11评估顺序(未定义的行为)
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 交换未定义数据类型中的字节顺序
- 用户定义的转换顺序(以C++为单位)
- 在C++中,当表达式涉及对象时,将表达式赋值到对象中时,是否有定义的操作顺序?
- 为什么在未由语言本身定义的结构字节中的位字段顺序
- 是定义的函数参数的内部执行顺序
- 为什么在定义静态成员变量时不遵循定义顺序
- 顺序自定义类型特征的行为就像一个
- 如何在使用 std::make_tuple 时避免构造函数的未定义执行顺序
- 对定义顺序的向量的子集进行高效排序
- C++ 为类中的集合定义顺序
- 如何在Qt Widget中重新定义Z顺序
- 使用自定义顺序迭代boost multi_index
- 类的作用域和定义顺序
- SFINAE和定义顺序
- c++中函数签名的定义顺序
- C++中的类定义顺序