POD初始化为零

Zero initialization of POD

本文关键字:初始化 POD      更新时间:2023-10-16
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的类型定义。

然而,vc++ 11的一个优化的32位版本,似乎在while循环中至少留下了line的部分未初始化。为什么?类型名后面的括号与new有区别吗?它应该是零初始化的,对吧?

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

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

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

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

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

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