我想设置一个类的填充字节为0,因为我在字节级保存/加载/比较/散列实例,并且垃圾初始化填充在每个操作中引入了非确定性。我怎样才能零等于一个类的填充字节?
我知道,这将实现我想要什么(对于平凡的可复制的类型):
struct Example
{
Example(char a_, int b_)
{
memset(this, 0, sizeof(*this));
a = a_;
b = b_;
}
char a;
int b;
};
我不喜欢这样做,虽然,有两个原因:我喜欢构造函数初始化器列表,我知道,将这些位设置为0并不总是与零初始化相同(例如,指针和浮点数不一定具有全零位的零值)。顺便说一下,它显然局限于可以复制的类型,但这对我来说不是问题,因为我上面列出的操作(在字节级别加载/保存/比较/散列)需要无论如何都可复制的类型。
我想什么是这样的[魔法]片段:
struct Example
{
Example(char a_, int b_) : a(a_), b(b_)
{
// Leaves all members alone, and sets all padding bytes to 0.
memset_only_padding_bytes(this, 0);
}
char a;
int b;
};
我怀疑这样的事情是可能的,因此,如果任何人都可以提出一个非丑替代......我所有的耳朵:)
我的建议:1,只是做了'memset的()',然后初始化明确(基本上是你的第一种方法),2。排除从哈希完全填充字节。 – 2013-10-23 15:12:56
“我不喜欢这样做,原因有两个......”请注意,第二个原因是无关紧要的,因为分配给成员的字节将由构造函数写入。 – dasblinkenlight
我的建议是,而不是使用'字节垫;'创建的填充类型,它可以自动调零本身(例如模板化的类型,这样你就可以控制大小'PadData垫;') –
benjymous