2013-04-22 44 views
1

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

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

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

谢谢你们俩 – grasshopper 2013-04-25 16:07:01

回答

2

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

9类

甲琐碎类是具有一个默认的构造(12.1)的一类,没有非平凡的默认构造, 和是平凡能够复制
10.一种POD struct108是一个非联合类,它既是一个普通的类,也是一个标准布局类,并且没有类型非POD结构,非POD联合(或这种类型的数组)的非静态数据成员 。

由于你的类有不平凡的默认构造函数,所以它不再微不足道,而且结果也不是POD类型。
最有可能的是将在大多数编译器上工作,不保证通过。

3

由于C++标准允许所有位为零的陷阱表示形式为floatdouble,因此无法保证正常工作。因此,阅读这些实施成员将会有不确定的行为。

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

实际上,它将适用于我所知道的所有实现。

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

foo f = {0}; 

这将intialize所有成员零个值,保证(无论是否由所有位归零来表示)。