POD零初始化

时间:2013-01-09 10:35:20

标签: c++ visual-c++ initialization pod compiler-bug

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
    ...
}

BoundsVector是非POD类,distint64_t的typedef。

然而,VC ++ 11的优化32位版本构建似乎在while循环中至少部分line未初始化。为什么?根据{{​​3}},它应该对其进行零初始化,对吗?

我将struct成员的值记录到文件中:

  • Line line = {};之后:非POD类型默认初始化,其他类型为0。
  • line = Line();之后:POD类型仍默认初始化,其他包含随机值。

1 个答案:

答案 0 :(得分:6)

你可能已经发现了编译器错误,虽然我似乎记得在C ++ 98中初始化POD结构的要求并没有明确描述。

根据C ++ 03,表达式Line()必须生成 value-initialised Line对象,在这种情况下,这意味着所有成员必须零初始化(因为所有成员都是标量)。

请注意,成员之间的最终填充不必设置为任何确定值,因此当您将Line对象视为一块内存时,这可能会导致误报。

解决方法是为Line提供一个显式初始化所有成员的默认构造函数。