带有此指针的Memset POD结构

时间:2013-04-22 11:17:05

标签: c++ initialization member pod

我有很多POD结构,包含很多成员变量。我只是使用memset而不是初始化构造函数中的每个成员。这在C ++中有效吗?

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

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

2 个答案:

答案 0 :(得分:3)

不能保证工作,因为C ++标准允许所有位为零的实现是floatdouble的陷阱表示。因此,阅读这些实现的成员会有不确定的行为。

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

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

其他答案使得有关您的类的有效点是非POD(C ++ 03)和非平凡(C ++ 11)。事实是,即使你删除了构造函数并从其他地方调用了memset,它仍然仍然不能保证按标准工作。但是如果你删除了构造函数,你可以使用聚合初始化:

foo f = {0};

这将保证所有成员初始化为零值(无论是否由all-bits-zero表示)。

答案 1 :(得分:2)

根据标准,你的struct不是POD类型,因此不允许使用memset。

9个类

  

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

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