gpt4 book ai didi

c++ - 我怎样才能将一个类的填充字节归零?

转载 作者:可可西里 更新时间:2023-11-01 16:35:37 26 4
gpt4 key购买 nike

我想将一个类的填充字节设置为 0,因为我在字节级别保存/加载/比较/散列实例,而垃圾初始化填充在每个操作中引入了非确定性。

我知道这将实现我想要的(对于普通可复制类型):

struct Example
{
Example(char a_, int b_)
{
memset(this, 0, sizeof(*this));
a = a_;
b = b_;
}
char a;
int b;
};

不过我不喜欢这样做,有两个原因:我喜欢构造函数初始化列表,而且我知道将位设置为 0 并不总是与零初始化相同(例如,指针和 float 不一定具有全为 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;
};

我怀疑这样的事情是否可能,所以如果有人能提出一个不丑陋的替代方案......我洗耳恭听:)

最佳答案

据我所知,在纯 C++ 中完全自动执行此操作是不可能的。我们使用自定义代码生成系统来实现这一点(除其他外)。您可以使用一个将所有成员变量名称输入其中的宏来完成此操作;它会简单地寻找 offsetof(memberA)+sizeof(memberA) 和 offsetof(memberB) 之间的漏洞。

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

哦,还有一个选择——您可以提供一个operator new,它在返回内存之前明确地清除内存。不过,我不喜欢这种方法......它不适用于堆栈分配。

关于c++ - 我怎样才能将一个类的填充字节归零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19545557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com