在C++中,构造函数和析构函数可以是内联函数吗?
问题描述:
VC++使得在类声明内联函数中实现的函数成为可能。在C++中,构造函数和析构函数可以是内联函数吗?
如果我声明如下的类Foo
,那么CONSTRUCTOR和DESTRUCTOR内联函数是什么?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
答
定义构造函数的主体INSIDE类与使用“inline”关键字将函数放在类外部的效果相同。
在这两种情况下,它都是编译器的暗示。 “内联”功能不一定意味着该功能将被内联。这取决于功能和其他规则的复杂性。
答
将函数定义放在类体中等同于使用inline关键字标记函数。这意味着函数可能会或可能不会被编译器内联。所以我想最好的答案是“可能”?
答
简短的回答是肯定的。任何函数都可以声明为inline,并且将函数体放入类定义中是实现此目的的一种方法。你也可以这样做:
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关键字告诉编译器,当你说“内联这个函数”时,你确实真的是这个意思,但它通常不值得。在很多情况下,编译器确实知道最好。
答
与我们可以使任何其他函数内联的程度相同,是的。
答
内联与否主要由您的编译器决定。内联代码只对编译器提示。
可以指望的一条规则是虚拟函数永远不会被内联。如果你的基类有虚拟的构造函数/析构函数,你的内核可能永远不会被内联。
这不仅仅是一个提示:内联允许您在多个翻译单元中定义相同的功能。这是在呼叫站点内联功能的前提条件(没有链接时优化),这是关键字获取它的名字的地方。 – 2010-12-01 11:42:00
@FredNurk我完全同意你的观点 - 然而Stroustrup自己(C++的设计和发展)引用了`inline`作为编译器的'提示' – 2014-05-14 10:02:58