向量和原始类型初始化

时间:2014-10-03 08:14:43

标签: c++ vector

我已经了解到,如果你在全局范围内声明一个int,那么

int x; //默认为0;

并在本地范围内,

void f() {
    int x; //undefined
}

但是,如果我们在全局或局部范围内使用向量:

矢量< INT> V(3); //使用int的默认构造函数将v初始化为{0,0,0}。

我们可以通过这样做默认初始化int,就像本地范围中vector的元素一样:

int x = int(); //默认为0

我认为如果我们使用int的默认构造函数,它就会在堆中分配。

  1. 为什么原始类型不能在本地范围内默认初始化,如T x;?或者
  2. 在本地范围内,为什么vector(关于其他容器的dunno)使用元素的默认构造函数而不是像int声明那样保持未初始化?
  3. 目前的方法对这两种类型有什么好处?为什么他们以不同的方式初始化?这是关于表现吗?

1 个答案:

答案 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!