c++ - POD的零初始化

标签 c++ visual-c++ initialization 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 的类型定义。

但是,优化的 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/

相关文章:

c++ - VS2010中的C99 : uint8_t* illegal use of type

C++:从装箱元素的 vector 构造一个 Box 类型的 vector

c++ - 未知类型的可变参数构造函数参数列表

c - 如何在 __attribute__((constructor)) 中为嵌套函数指定优先级?

swift - 'let' 属性不能直接初始化;使用 "self.init(...)"或 "self = ..."代替

c++ - 以交替模式合并两个 STL vector

c++ - 在我输入时显示 *(隐藏/屏蔽输入)

c++ - 从 'unsigned int'到 'int'的转换需要缩小转换

c++ - MS visual studio IDE下如何使用g++编译器

c++ - std::map - 递减迭代器给出奇怪的结果?