我怎样才能将类的填充字节归零?

Ben*_*ers 9 c++ padding

我想将类的填充字节设置为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)

我怀疑这样的事情是可能的,所以如果有人能提出一个非丑陋的选择......我全都耳朵:)

Sne*_*tel 7

我不知道在纯C++中完全自动完成这项工作.我们使用自定义代码生成系统来完成此任务(除此之外).您可以通过一个宏来完成此操作,您可以为其提供所有成员变量名称; 它只会在offsetof(memberA)+ sizeof(memberA)和offsetof(memberB)之间寻找漏洞.

或者,在成员基础上序列化/散列,而不是二进制blob.那是十种清洁剂.

哦,另一个选项 - 你可以operator new在返回之前提供明确清除内存的内容.我不是那种方法的粉丝,但它不适用于堆栈分配.

  • “以成员为基础进行序列化/散列”-我绝对知道这是正确的做法,我只是不想为每个类、每个操作键入所有这些成员名称……但具有讽刺意味的是,我仅仅通过问这个问题,已经输入的内容远不止这些:) (2认同)