我想澄清一下在堆栈上实例化类时会发生什么。
当 C++ 类在堆上实例化时:
MyClass *myclass = new MyClass();
创建 MyClass 类型的指针,并通过“new MyClass();”在同一行实例化该类。像这样拉伸它:
MyClass *myclass;
myclass = new MyClass();
如果我没有记错的话,在第一行创建一个指针,然后为第二行的实例分配内存,并将指向实例地址的指针分配给 myclass。
这是否意味着当一个类以这种方式在堆栈上实例化时:
MyClass myclass = MyClass();
它被创建了两次?
“栈”和“堆”在C++中没有定义,不需要在任何地方分配内存。
以你为例:
MyClass myclass = MyClass();
你正在初始化myclass
通过复制构造函数到临时对象。myclass
(和临时的)具有自动存储,如果您高兴的话,您可以考虑将其分配在“堆栈”上。
在这种情况下允许复制省略,本质上将其优化为MyClass myClass
,但请注意,它不能总是这样做,例如当复制构造函数是私有的时。
这是您可以测试的示例:
struct obj {
static int c;
int myc;
obj() : myc(c++) {
std::cout << "ctor of " << myc << '\n';
}
obj(const obj&) : myc(c++){
std::cout << "copy ctor of " << myc << '\n';
}
~obj() {
std::cout << "dtor of " << myc << '\n';
}
};
int obj::c = 1;
int main(int argc, char** argv)
{
obj x = obj();
}
如果副本被删除,您将看到:
ctor of 1
dtor of 1
否则(gcc选项 -fno-elide-constructors 来防止省略发生):
ctor of 1
copy ctor of 2
dtor of 1
dtor of 2
此外,将复制构造函数设置为私有会导致编译器错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)