在C ++中,构造函数和析构函数可以是内联函数吗?
65365 观看
5回复
VC ++使在类声明内联函数中实现的函数成为可能。
如果我Foo
按如下方式声明一个类,那么CONSTRUCTOR和DESTRUCTOR内联函数是吗?
class Foo
{
int* p;
public:
Foo() { p = new char[0x00100000]; }
~Foo() { delete [] p; }
};
{
Foo f;
(f);
}
作者: popopome
的来源
发布者: 2019 年 10 月 22 日
回应 (5)
64像
在类INSIDE内定义构造函数的主体具有与将函数OUTSIDE放置在带有“ inline”关键字的类相同的效果。
在两种情况下,这都是编译器的提示。“内联”函数不一定意味着该函数将被内联。这取决于功能和其他规则的复杂性。
作者: user2189331 发布者: 21.08.2008 10:1028像
简短的答案是肯定的。任何函数都可以内联声明,而将函数主体放入类定义中是这样做的一种方式。您也可以这样做:
class Foo
{
int* p;
public:
Foo();
~Foo();
};
inline Foo::Foo()
{
p = new char[0x00100000];
}
inline Foo::~Foo()
{
delete [] p;
}
但是,是否确实内联函数取决于编译器。VC ++几乎忽略了您的内联请求。如果认为这是个好主意,则只会内联函数。如果您使用链接时间代码生成,则最新版本的编译器还将内联在单独的.obj文件中且未声明为内联的内容(例如,来自不同.cpp文件中的代码)。
您可以使用__forceinline关键字来告诉编译器,当您说“内联此函数”时,您实际上是真的意思,但这通常不值得。在许多情况下,编译器确实确实最了解。
作者: Wilka 发布者: 21.08.2008 10:124像
将函数定义放在类主体中等效于使用inline关键字标记函数。这意味着编译器可能会内联函数,也可能不会内联函数。所以我猜最好的答案是“也许”?
作者: Mickey 发布者: 21.08.2008 10:112像
2像
是否内联主要由编译器决定。内联代码仅向编译器提示。
您可以依靠的一条规则是虚拟函数永远不会被内联。如果您的基类具有虚拟构造函数/析构函数,则您可能永远不会内联。
来自类别的问题 :
- c++ 理解指针有什么障碍,克服它们可以做些什么?
- c++ 在C ++中解析INI文件的最简单方法是什么?
- c++ 什么时候应该在C ++中使用“朋友”?
- c++ 你如何清除stringstream变量?
- c++ 在C ++中,构造函数和析构函数可以是内联函数吗?
- c++ 在C ++中,什么是虚拟基类?
- constructor 有多少构造函数参数太多了?
- constructor 什么时候构造函数抛出异常?
- constructor 显式关键字是什么意思?
- constructor 带空括号的默认构造函数
- constructor 静态工厂方法与实例(普通)构造函数?
- destructor 是否有Java的析构函数?
- destructor 如果构造函数抛出异常,则调用析构函数吗?
- destructor 在C#中使用IDisposable与析构函数有什么区别?
- destructor 我是否需要显式调用基本虚拟析构函数?
- destructor “空”构造函数或析构函数将执行与生成的相同的事情吗?