2

我有很多带有很多成员变量的 POD 结构。我没有在构造函数中初始化每个成员,而是简单地使用 memset。这在 C++ 中有效吗?

struct foo
{
    foo() { std::memset(this, 0, sizeof (foo)); }

    int var1;
    float var2;
    double var3;
    // more variables..
};
4

2 回答 2

3

它不能保证工作,因为 C++ 标准允许实现,其中所有位为零是floator的陷阱表示double。因此,在此类实现中阅读这些成员将具有未定义的行为。

这同样适用于实现可能放在数据成员之间的任何填充字节——修改它们要么是未定义的行为,要么将对象置于未定义的状态,在使用时具有未定义的行为。我忘了哪个。

但在实践中,它适用于我知道的所有实现。

其他答案表明您的课程是非 POD (C++03) 和非平凡 (C++11)。问题是,即使您删除了构造函数并memset从其他地方调用它仍然不能保证按标准工作。但是,如果您确实删除了构造函数,则可以使用聚合初始化:

foo f = {0};

并且保证将所有成员初始化为零值(无论是否由所有位为零表示)。

于 2013-04-22T11:22:52.797 回答
2

根据标准,您的结构不是 POD 类型,因此不允许使用 memset。

9班

平凡类是具有默认构造函数 (12.1)、没有非平凡默认构造函数且可平凡复制
的类 10 POD struct108 是一个非联合类,它既是平凡类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。

由于您的类具有非平凡的默认构造函数,因此它不再是平凡的,因此不是 POD 类型。
很可能会在大多数编译器上工作,不能保证通过。

于 2013-04-22T11:21:17.847 回答