c++ - 为什么类成员函数是内联的?

标签 c++ class function compiler-construction inline

我想我的问题以前在这里被问过,我确实阅读了它们,但仍然有点困惑,因此要求说清楚。

C++ 标准规定所有在类定义中定义的成员函数都是内联的

我还听说编译器可以忽略函数的内联。在上述情况下是这样吗?或者如果在类定义中定义它总是内联?

另外,这个设计背后的原因是什么,让所有在类定义中定义的函数都内联?内联与源文件和头文件有什么关系?

更新:所以如果不被内联,就应该总是在类之外定义它们的函数,对吧?

JohnB 的更新 2: 在类定义中声明的两个函数永远不能互相调用,因为它们都必须包含另一个函数的整个主体。在这种情况下会发生什么?(Emilio Garavaglia 已经回答)

最佳答案

因为内联有两个效果,所以会产生混淆:

  1. 它告诉编译器函数代码可以在函数被调用的地方扩展,而不是有效地被调用
  2. 它告诉编译器函数定义可以重复。

第 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/

相关文章:

c++ - Qt检查外部进程是否崩溃

c++ - 如何使用boost从文件中读取图形?

C++ 类(组合和继承 - 头文件、类数组)

python - 绑定(bind)方法上的装饰器可以访问类及其祖先

php - 全局变量从函数中消失

c - 不显示计算结果的函数

c++ - 从 DLL 动态加载函数

c++ - 在 vector 循环 C++ 中使用对象方法

ios - swift 类别 : "Cannot convert value of type to expected argument type ' AnyObject! '

javascript - 函数内函数中参数的初始值是多少?