我想我的问题以前在这里被问过,我确实阅读了它们,但仍然有点困惑,因此要求说清楚。
C++ 标准规定所有在类定义中定义的成员函数都是内联的
我还听说编译器可以忽略函数的内联。在上述情况下是这样吗?或者如果在类定义中定义它总是内联?
另外,这个设计背后的原因是什么,让所有在类定义中定义的函数都内联?内联与源文件和头文件有什么关系?
更新:所以如果不被内联,就应该总是在类之外定义它们的函数,对吧?
JohnB 的更新 2: 在类定义中声明的两个函数永远不能互相调用,因为它们都必须包含另一个函数的整个主体。在这种情况下会发生什么?(Emilio Garavaglia 已经回答)
最佳答案
因为内联有两个效果,所以会产生混淆:
- 它告诉编译器函数代码可以在函数被调用的地方扩展,而不是有效地被调用。
- 它告诉编译器函数定义可以重复。
第 1 点是“过时的”,因为编译器实际上可以为所欲为,以优化代码。如果可以并且发现方便,它将始终“内联”机器代码,如果不能,它将永远不会这样做。
Point 2. 是该术语的实际含义:如果您在 header 中define
(指定主体)函数,由于 header 可以包含在更多源中,因此您必须告诉编译器通知链接器定义重复,以便它们可以合并。
现在,根据语言规范,自由函数(未在类主体中定义)默认情况下未定义为内联,因此在标题中定义类似
void myfunc()
{}
如果header包含在多个源中,然后在同一个输出中链接,链接器会报多重定义错误,因此需要将其定义为
inline void fn()
{}
对于类成员,默认是相反的:如果你只是声明它们,它们不会被内联。如果您定义它们,它们将是内联的。
所以标题应该是这样的
//header file
class myclass
{
public:
void fn1()
{} //defined into the class, so inlined by default
void fn2();
};
inline void myclass::fn2()
{} //defined outside the class, so explicit inline is needed
如果 myclass::fn2()
定义进入适当的来源,则必须丢失 inline
关键字。
关于c++ - 为什么类成员函数是内联的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9734175/