我已经了解到,如果你在全局范围内声明一个int,那么
int x; //默认为0;
并在本地范围内,
void f() {
int x; //undefined
}
但是,如果我们在全局或局部范围内使用向量:
矢量< INT> V(3); //使用int的默认构造函数将v初始化为{0,0,0}。
我们可以通过这样做默认初始化int,就像本地范围中vector的元素一样:
int x = int(); //默认为0
我认为如果我们使用int的默认构造函数,它就会在堆中分配。
答案 0 :(得分:2)
出于“性能”的原因,这就是这个原因,因为C ++人们希望那些在20世纪80年代回归的人们没有理由抱怨“付出我们不需要的东西”。这是C ++的原则之一,不为不使用的东西支付(运行时)成本。所以旧的POD类型默认是未初始化的,尽管带有构造函数的类和结构总是有一个被调用的构造函数。
如果我今天指定它,我会说本地范围内的int x;
将默认初始化(为0),如果你想避免这样做,你可以说int x = std::noinit;
之类的东西。现在已经太晚了,但是当性能很重要时,我实际上已经在某些类型中完成了它:
class SuperFast
{
struct no_init_t {};
public:
no_init_t no_init;
SuperFast() : x(0), y(0) {}
SuperFast(no_init_t) {}
private:
int x, y;
};
这样,默认构造将提供一个有效的对象,但如果你有一个明确的理由需要避免这种情况,你可以。如果你知道你很快就会覆盖一大堆这些对象,你可能会使用这种技术 - 不需要默认构造它们:
SuperFast sf(SuperFast::no_init); // look ma, I saved two nanoseconds!