2

以下自由函数是否在 C++ 中隐式内联,类似于在类定义中定义的成员函数如何被隐式内联?

void func() { ... }

模板函数的行为方式是否相同?

4

3 回答 3

6

这取决于内联的含义。编译器可以通过将其发出的代码内联到调用站点来优化任何函数。但是,如果您的意思是您询问的代码是否表现得好像它已被声明:

inline void func() { ... }

那么答案是否定的。如果您将代码放在两个不同的编译单元中并构建可执行文件,您将得到多个定义错误。如果您将函数明确标记为“内联”,则不会。

关于模板函数,编译系统的某些部分将确保同一模板的多个实例化不会导致多个定义错误。

于 2009-07-04T12:14:35.623 回答
5

不,它不是隐式内联的。编译器无法知道另一个模块是否会使用这个函数,所以它必须为它生成代码。

这意味着,例如,如果您在标头中定义这样的函数并包含标头两次,您将收到有关多个定义的链接器错误。显式inline解决了这个问题。

当然,编译器仍然可以内联函数,如果它认为这将是有效的,但它与显式内联不同。

模板函数是隐式内联的,因为它们不需要inline防止多个定义错误。我认为编译器也不会被迫内联这些,但我不确定。

于 2009-07-04T12:17:26.770 回答
1

它可能是内联的,这取决于编译器是否决定使其内联。

于 2009-07-04T12:11:29.483 回答