在C ++中,构造函数和析构函数可以是内联函数吗?
时间:2020-03-05 18:41:48 来源:igfitidea点击:
VC ++使在类声明内联函数中实现的函数成为可能。
如果我按如下方式声明类" Foo",那么CONSTRUCTOR和DESTRUCTOR内联函数是吗?
class Foo { int* p; public: Foo() { p = new char[0x00100000]; } ~Foo() { delete [] p; } }; { Foo f; (f); }
解决方案
回答
在类INSIDE内定义构造函数的主体具有与将函数OUTSIDE放置在带有" inline"关键字的类相同的效果。
在两种情况下,这都是编译器的提示。 "内联"函数不一定意味着该函数将被内联。这取决于功能和其他规则的复杂性。
回答
将函数定义放在类主体中等效于使用inline关键字标记函数。这意味着编译器可能会内联函数,也可能不会内联函数。所以我猜最好的答案是"也许"?
回答
简短的答案是肯定的。任何函数都可以内联声明,而将函数主体放入类定义中是这样做的一种方式。我们也可以这样做:
class Foo { int* p; public: Foo(); ~Foo(); }; inline Foo::Foo() { p = new char[0x00100000]; } inline Foo::~Foo() { delete [] p; }
但是,这取决于编译器是否确实内联了该函数。 VC ++几乎忽略了内联请求。如果它认为是一个好主意,则只会内联一个函数。如果我们使用链接时间代码生成,则最新版本的编译器还将内联在单独的.obj文件中且未声明为内联的内容(例如,来自不同.cpp文件中的代码)。
我们可以使用__forceinline关键字来告诉编译器,当我们说"内联此函数"时,我们实际上是真的意思,但这通常不值得。在许多情况下,编译器确实确实最了解。
回答
在一定程度上,我们可以内联任何其他函数,是的。
回答
是否内联主要由编译器决定。内联代码仅提示编译器。
我们可以依靠的一条规则是虚拟函数将永远不会被内联。如果基类具有虚拟构造函数/析构函数,则我们可能永远不会内联。