向量和基元类型初始化
vector and primitive type initialisation
我了解到,如果在全局范围中声明一个int,
int x//默认为0;
在本地范围内,
void f() {
int x; //undefined
}
然而,如果我们在全局或局部范围内使用向量:
向量<int>v(3)//使用int的默认构造函数将v初始化为{0,0,0}。
我们可以在本地范围内默认初始化类似int的矢量元素:
int x=int()//默认为0
我认为如果我们使用int的默认构造函数,它是在堆中分配的。
- 为什么基元类型不能像Tx;那样在本地作用域中默认初始化;?或者
- 在本地作用域中,为什么向量(不知道其他容器)使用元素的默认构造函数,而不是像int声明一样保持未初始化状态
- 当前方法对这两种类型有什么好处?为什么它们的初始化方式不同?这是关于性能的吗
这是出于"性能"的原因,因为C++人员希望20世纪80年代的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++指针和数据类型初始化
- C++ 基元类型初始化与对象初始化
- C++ 2D shared_ptr数组使用抽象多态类型初始化
- 如何根据构造函数参数使用超类类型初始化成员变量?
- 使用没有默认构造函数的类/类型初始化自定义容器
- Visual C 新类型初始化
- 如何创建一个编译时静态类类型,该类型初始化具有特定值的成员容器
- 使用初始化列表的 POD 类型初始化不起作用
- 大括号之间的自定义类型初始化数组
- std::数组类型初始化
- 错误:类型初始化无效
- 基本类型初始化C++
- 使用派生类类型初始化模板类的静态数组
- 部分默认使用内部类型初始化模板模板参数
- 类型初始化使用 OpenSsl.net 异常
- 存储可以使用不同派生类型初始化的基类型成员变量时,请避免使用new
- 向量和基元类型初始化
- 基元类型初始化的构造函数语法和赋值语法之间的差异
- 是否可以从大括号类型初始化中推断出元组的模板参数
- 可从任何序列类型初始化的c++类