我有很多 bool 属性的对象,所以我使用位域来更紧凑地打包属性。我还希望能够以紧凑的方式序列化和反序列化这些属性,例如不是逐个字段,而是通过序列化和反序列化保存字段的 64 位 uint。这种方式不仅速度更快(例如,避免所有移位和其他东西),而且内存效率提高了 8 倍。
但是,我读到该标准不保证位域实现在不同平台上是统一的。我可以期望位域容器的“批量”二进制序列化会跨平台产生统一的结果吗?或者在使用属性时进行手动移位和屏蔽可能会更安全,以便可以进行批量序列化和反序列化?
最佳答案
你可以看看std::bitset :
它为 cast your bits into an unsigned long long 提供定义明确的函数, 和 create a bitset from a stored unsigned long long .定义 bitset 中的第一位是 ullong
表示的最低有效位。
所以你可以有这样的东西:
std::bitset<N> bits;
unsigned long long val = bits.to_ullong();
// serialize your ullong value
// load ullong from serialized data
unsigned long long val2 = ...;
std::bitset<N> newBits(val2);
因此,只要您的序列化能够正确加载/存储 unsigned long long
,您就可以开始了。
唯一的问题是当您的位域对于 unsigned long long
来说太大时。在这种情况下,标准没有提供提取位域的简单方法。
关于c++ - 位域的二进制 "bulk"序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25017902/