6
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 类,distint64_t.

但是,经过优化的 VC++11 32 位发布版本似乎至少line在 while 循环中留下了未初始化的部分。为什么?根据类型名称后的括号是否与新的有所不同?,它应该对它进行零初始化,对吧?

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

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

1 回答 1

6

您可能已经发现了一个编译器错误,尽管我似乎记得在 C++98 中初始化 POD 结构的要求并没有像描述的那样清楚。

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

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

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

于 2013-01-09T11:00:34.510 回答