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
的类型定义。
但是,优化的 32 位 VC++11 发布版本似乎在 while 循环中至少留下了 line
的部分未初始化。为什么?根据Do the parentheses after the type name make a difference with new? ,它应该对它进行了零初始化,对吧?
我将结构成员的值记录到一个文件中:
- 在
行line = {};
之后:非POD类型默认初始化,其他为0。 - 在
line = Line();
之后:POD 类型仍然默认初始化,其他类型包含随机值。
最佳答案
您可能发现了一个编译器错误,尽管我似乎记得在 C++98 中,初始化 POD 结构的要求并没有明确描述。
根据 C++03,表达式 Line()
必须生成一个 value-initialised Line 对象,在这种情况下,这意味着所有成员都必须 < em>零初始化(因为所有成员都是标量)。
请注意,成员之间的最终填充不必设置为任何确定值,因此当您将 Line 对象视为内存块时,这可能会导致误报。
解决方法是为显式初始化所有成员的 Line
提供默认构造函数。
关于c++ - POD的零初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14233305/