POD初始化为零
Zero initialization of POD
struct Line
{
Bounds bounds_;
Vector origin_;
uint32_t begin_;
uint32_t end_;
dist ascent_;
dist descent_;
};
的用法如下:
Line line = {};
while (!parser.done()) {
line = Line(); // zero-initialize
...
}
Bounds
和Vector
为非pod类,dist
为int64_t
的类型定义。
然而,vc++ 11的一个优化的32位版本,似乎在while循环中至少留下了line
的部分未初始化。为什么?类型名后面的括号与new有区别吗?它应该是零初始化的,对吧?
我将结构体成员的值记录到一个文件中:
-
Line line = {};
后:非pod类型默认初始化,其他为0。 - 在
line = Line();
之后:POD类型仍然默认初始化,其他包含随机值。
您可能已经发现了一个编译器错误,尽管我似乎记得在c++ 98中初始化pod结构的要求并没有被清楚地描述。
根据c++ 03,表达式Line()
必须产生一个值初始化的行对象,在这种情况下,这意味着所有成员必须是零初始化的(因为所有成员都是标量)。
请注意,成员之间的最终填充不必设置为任何确定的值,因此当您将Line对象视为内存blob时,可能会导致误报。
解决方法是为Line
提供一个默认构造函数,该构造函数显式初始化所有成员。
相关文章:
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 非 POD 的零初始化
- 如何让MSVC编译器优化多步POD初始化?
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 类POD成员变量初始化
- C++函数中的多线程静态 POD 初始化
- 初始化新对象时C++默认构造函数和 POD 问题
- POD成员默认初始化无括号
- 视觉C++似乎正在零初始化一个不应该的类的 POD 成员
- 如何在派生类中初始化继承的模板POD结构
- 构造函数初始化列表中POD类型的初始化
- 使用初始化列表的 POD 类型初始化不起作用
- 继承的 POD 类型的值初始化
- 初始化POD数组中的第一个元素,保持其余元素未初始化
- POD变量的直接初始化不起作用,但当将变量推到向量上时,复制初始化起作用
- POD 类对象初始化是否需要构造函数
- 为什么在初始化项列表中初始化 POD 数据时必须使用 C 样式类型转换
- 如何使用C++中的括号语法初始化POD数组
- 获取默认初始化(NOT value/零初始化)POD作为右值