POD零初始化

Dan*_*ger 6 c++ initialization pod visual-c++ compiler-bug

struct Line
{
    Bounds          bounds_;
    Vector          origin_;
    uint32_t        begin_; 
    uint32_t        end_;   
    dist            ascent_;
    dist            descent_;
};
Run Code Online (Sandbox Code Playgroud)

使用如下:

Line line = {};
while (!parser.done()) {
    line = Line(); // zero-initialize
    ...
}
Run Code Online (Sandbox Code Playgroud)

Bounds并且Vector是非POD类,dist是一个typedef int64_t.

但是,VC++ 11的优化32位版本构建似乎line在while循环中至少留下了未初始化的部分内容.为什么?根据Do,括号后的类型名称与new有所区别?,它应该零初始化它,对吧?

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

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

Bar*_*nau 6

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

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

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

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