在C ++中定义类内而不是外部的成员函数?

时间:2015-04-14 13:23:36

标签: c++ function inline header-files

通过在头文件中的类中写入成员函数的定义,如下所示,我被告知编译器将其视为内联函数 - 因此,在程序中遇到此函数的任何地方,它都会输入完成每次函数的主体而不是跳转到函数驻留在内存中的一个位置。这是真的吗?

class myClass
{
    public:
       void Fun1()
       {
         //implemented here
       }
}

4 个答案:

答案 0 :(得分:2)

  

我被告知编译器将其视为内联函数

正确。这意味着它允许在多个翻译单元中定义,如果您想在标题中定义它并在程序中多次包含该标题,则必须这样做。

  

因此,在程序中遇到此函数的任何地方,它每次进入函数的完整主体,而不是跳转到函数驻留在内存中的一个位置

不,这不是inline在函数定义的上下文中的含义。这是函数调用内联的优化,如果编译器认为它会改进代码,它可以应用于任何调用。

这两个概念松散相关:一次处理单个翻译单元的编译器只能将优化应用于当前单元中定义的函数,因此他们需要有多个定义才能够在多个单元中优化它们。

答案 1 :(得分:0)

如果在类定义中定义一个函数,则默认为内联(无需指定' inline')

编译器用实际代码替换内联函数调用的所有实例。

注意:编译器可能会忽略'内联'函数的限定符,如果它是多行。您还需要重新编译所有组件(使用该功能的组件),以便编译器可以用新代码替换代码块。

答案 2 :(得分:0)

你是正确的,头文件中定义的函数是隐含的"内联"。但是inline关键字只是对编译器的一个提示。根据其实现,函数内容和优化标志,编译器可能决定内联函数。

答案 3 :(得分:0)

如果您的问题是否相当于:

class myClass
{
public:
   void Fun1();
};

inline void myClass::Fun1()
{
     //implemented here
}

答案是:是的。

如果您的问题是该函数是否将内联实际扩展,答案是:未完成。取决于编译器的优化标志并规则它的工作原理。

C ++中“内联”的含义是:如果编译器以脱节形式发出此函数(通过完全不扩展或作为替代),它会经历弱(模糊)链接(两个这样的两个函数)链接在一起的不同目标文件导致将第一个目标文件作为一个很好的交易。)

这与普通的外部函数形成对比,后者经历强联系(链接在一起的两个不同目标文件中的两个这样的函数会导致链接器错误)。