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