我有很多带有很多成员变量的 POD 结构。我没有在构造函数中初始化每个成员,而是简单地使用 memset。这在 C++ 中有效吗?
struct foo
{
foo() { std::memset(this, 0, sizeof (foo)); }
int var1;
float var2;
double var3;
// more variables..
};
我有很多带有很多成员变量的 POD 结构。我没有在构造函数中初始化每个成员,而是简单地使用 memset。这在 C++ 中有效吗?
struct foo
{
foo() { std::memset(this, 0, sizeof (foo)); }
int var1;
float var2;
double var3;
// more variables..
};
它不能保证工作,因为 C++ 标准允许实现,其中所有位为零是float
or的陷阱表示double
。因此,在此类实现中阅读这些成员将具有未定义的行为。
这同样适用于实现可能放在数据成员之间的任何填充字节——修改它们要么是未定义的行为,要么将对象置于未定义的状态,在使用时具有未定义的行为。我忘了哪个。
但在实践中,它适用于我知道的所有实现。
其他答案表明您的课程是非 POD (C++03) 和非平凡 (C++11)。问题是,即使您删除了构造函数并memset
从其他地方调用它仍然不能保证按标准工作。但是,如果您确实删除了构造函数,则可以使用聚合初始化:
foo f = {0};
并且保证将所有成员初始化为零值(无论是否由所有位为零表示)。
根据标准,您的结构不是 POD 类型,因此不允许使用 memset。
平凡类是具有默认构造函数 (12.1)、没有非平凡默认构造函数且可平凡复制
的类 10 POD struct108 是一个非联合类,它既是平凡类又是标准布局类,并且没有非 POD 结构、非 POD 联合(或此类类型的数组)类型的非静态数据成员。
由于您的类具有非平凡的默认构造函数,因此它不再是平凡的,因此不是 POD 类型。
很可能会在大多数编译器上工作,不能保证通过。