VC ++生成在类声明内联函数中实现的函数。
如果我按如下方式声明一个类Foo
,那么是CONSTRUCTOR和DESTRUCTOR内联函数吗?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
答案 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)
内联与否内核主要由编译器决定。代码中的内联仅提示编译器 您可以依赖的一条规则是永远不会内联虚拟函数。如果您的基类具有虚拟构造函数/析构函数,则可能永远不会内联。