在C ++中,构造函数和析构函数可以是内联函数吗?

c++ constructor destructor

65365 观看

5回复

5695 作者的声誉

VC ++使在类声明内联函数中实现的函数成为可能。

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

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

{
    Foo f;
    (f);
}
作者: popopome 的来源 发布者: 2008 年 8 月 21 日

回应 5


64

0 作者的声誉

决定

在类INSIDE内定义构造函数的主体具有与将函数OUTSIDE放置在带有“ inline”关键字的类相同的效果。

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

作者: user2189331 发布者: 2008 年 8 月 21 日

4

592 作者的声誉

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

作者: Mickey 发布者: 2008 年 8 月 21 日

28

21450 作者的声誉

简短的答案是肯定的。任何函数都可以内联声明,而将函数主体放入类定义中是这样做的一种方式。您也可以这样做:

class Foo 
{
    int* p;
public:
    Foo();
    ~Foo();
};

inline Foo::Foo() 
{ 
    p = new char[0x00100000]; 
}

inline Foo::~Foo()
{ 
    delete [] p; 
}

但是,是否确实内联函数取决于编译器。VC ++几乎忽略了您的内联请求。如果认为这是个好主意,则只会内联函数。如果您使用链接时间代码生成,则最新版本的编译器还将内联在单独的.obj文件中且未声明为内联的内容(例如,来自不同.cpp文件中的代码)

您可以使用__forceinline关键字来告诉编译器,当您说“内联此函数”时,您实际上是真的意思,但这通常不值得。在许多情况下,编译器确实确实最了解。

作者: Wilka 发布者: 2008 年 8 月 21 日

2

15387 作者的声誉

在某种程度上,我们可以使任何其他函数内联,是的。

作者: DrPizza 发布者: 2008 年 8 月 21 日

2

1408 作者的声誉

是否内联主要由编译器决定。内联代码仅向编译器提示。
您可以依靠的一条规则是虚拟函数永远不会被内联。如果您的基类具有虚拟构造函数/析构函数,则您可能永远不会内联。

作者: Rodney Schuler 发布者: 2008 年 10 月 21 日
32x32