我想将类的填充字节设置为0,因为我在字节级保存/加载/比较/散列实例,并且垃圾初始化填充在每个操作中引入了非确定性.
我知道这将实现我想要的(对于简单的可复制类型):
struct Example
{
Example(char a_, int b_)
{
memset(this, 0, sizeof(*this));
a = a_;
b = b_;
}
char a;
int b;
};
Run Code Online (Sandbox Code Playgroud)
我不喜欢这样做,原因有两个:我喜欢构造函数初始化列表,我知道将位设置为0并不总是与零初始化相同(例如,指针和浮点数不一定具有零值这都是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;
};
Run Code Online (Sandbox Code Playgroud)
我怀疑这样的事情是可能的,所以如果有人能提出一个非丑陋的选择......我全都耳朵:)
我不知道在纯C++中完全自动完成这项工作.我们使用自定义代码生成系统来完成此任务(除此之外).您可以通过一个宏来完成此操作,您可以为其提供所有成员变量名称; 它只会在offsetof(memberA)+ sizeof(memberA)和offsetof(memberB)之间寻找漏洞.
或者,在成员基础上序列化/散列,而不是二进制blob.那是十种清洁剂.
哦,另一个选项 - 你可以operator new在返回之前提供明确清除内存的内容.我不是那种方法的粉丝,但它不适用于堆栈分配.
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |