【问题标题】:In C++ can constructor and destructor be inline functions?在 C++ 中,构造函数和析构函数可以是内联函数吗?
【发布时间】:2010-09-06 11:37:33
【问题描述】:

VC++ 生成在类声明内联函数中实现的函数。

如果我如下声明一个类 Foo,那么 CONSTRUCTOR 和 DESTRUCTOR 是内联函数吗?

class Foo 
{
    int* p;
public:
    Foo() { p = new char[0x00100000]; }
    ~Foo() { delete [] p; }
};

{
    Foo f;
    (f);
}

【问题讨论】:

    标签: c++ constructor destructor


    【解决方案1】:

    在类内部定义构造函数的主体与使用“inline”关键字将函数置于类外部具有相同的效果。

    在这两种情况下,它都是对编译器的提示。 “内联”函数并不一定意味着该函数将被内联。这取决于函数的复杂性和其他规则。

    【讨论】:

    • 这不仅仅是一个提示:内联允许您在多个翻译单元中定义相同的函数。这是在调用站点内联函数的先决条件(没有链接时优化),这是关键字获得其名称的地方。
    • @FredNurk 我完全同意你的看法——但是 Stroustrup 本人(C++ 的设计和演变)将inline 称为编译器的“提示”
    • 如上所述,这个答案已经过时了。 Here 是对类似问题的最新答案。
    【解决方案2】:

    将函数定义放在类体中相当于使用 inline 关键字标记函数。这意味着该函数可能会或可能不会被编译器内联。所以我想最好的答案是“也许”?

    【讨论】:

      【解决方案3】:

      简短的回答是肯定的。任何函数都可以内联声明,将函数体放在类定义中是一种方法。你也可以这样做:

      class Foo 
      {
          int* p;
      public:
          Foo();
          ~Foo();
      };
      
      inline Foo::Foo() 
      { 
          p = new char[0x00100000]; 
      }
      
      inline Foo::~Foo()
      { 
          delete [] p; 
      }
      

      但是,它是否真的内联函数取决于编译器。 VC++ 几乎忽略了您的内联请求。如果它认为这是一个好主意,它只会内联一个函数。如果您使用 link time code generation,最新版本的编译器还将内联位于单独 .obj 文件中且未声明为内联的内容(例如,来自不同 .cpp 文件中的代码)。

      您可以使用__forceinline 关键字告诉编译器,当您说“内联此函数”时,您是认真的,但通常不值得。在很多情况下,编译器确实最清楚。

      【讨论】:

      • 请注意,__forceinline 是 VC++ 特定的词,而不是一般的 C++ 关键字。
      【解决方案4】:

      就像我们可以使任何其他函数内联一样,是的。

      【讨论】:

        【解决方案5】:

        是否内联主要取决于您的编译器。代码中的内联仅提示编译器。
        您可以信赖的一条规则是永远不会内联虚函数。如果你的基类有虚拟构造函数/析构函数,你的可能永远不会被内联。

        【讨论】:

        • 顺便说一句,如果编译器知道被破坏对象的(完整)类型,则可以内联虚拟成员函数(包括虚拟析构函数)。
        猜你喜欢
        • 1970-01-01
        • 2011-04-03
        • 2010-12-16
        • 2016-02-27
        • 2016-09-09
        • 1970-01-01
        • 1970-01-01
        • 2014-05-22
        • 2013-07-07
        相关资源
        最近更新 更多