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

时间:2008-08-21 22:02:58

标签: c++ constructor destructor

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

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

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

{
    Foo f;
    (f);
}

5 个答案:

答案 0 :(得分:62)

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

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

答案 1 :(得分:27)

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

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关键字告诉编译器您真正的意思,但它通常不值得。在许多情况下,编译器确实最了解。

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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