gpt4 book ai didi

c++ - vector 和原始类型初始化

转载 作者:行者123 更新时间:2023-11-30 04:00:43 25 4
gpt4 key购买 nike

我了解到,如果您在全局范围内声明例如一个 int,

整数 x;//默认为0;

在本地范围内,

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

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

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

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

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

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

  1. 为什么原始类型不能像 T x; 这样在本地范围内被默认初始化?或者
  2. 在本地范围内,为什么 vector (不知道其他容器)使用元素的默认构造函数而不像 int 声明一样让它们处于未初始化状态?
  3. 当前方法对这两种类型有何好处?为什么它们以不同的方式初始化?这与性能有关吗?

最佳答案

这是出于“性能”原因,因为 C++ 人员希望 1980 年代的 C 人员没有任何理由提示“为我们不需要的东西付费”。这是 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!

关于c++ - vector 和原始类型初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26175510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com