在从磁盘写入和读取的结构中使用std :: bitset是否可以?

时间:2016-04-13 17:39:07

标签: c++ serialization bitset

我需要在文件中存储位,而std::bitset对于这个来说是完美的,因为当我再次读回结构时,我需要很多操作。该类似乎只包含一个位数组而没有其他成员数据。

所以不是这个

BYTE minuteOfDay[(60 * 24 / CHAR_BIT) + ((60 * 24 % CHAR_BIT) ? 1 : 0)];

我可以拥有这个:

std::bitset<60 * 24> minuteOfDay;

如果该类应该在将来的Visual Studio版本中更改,并且我需要读取使用旧版本编写的文件,我想我仍然可以将旧的<bitset>标题复制到我的项目中。

但是在做出一个非常愚蠢的决定之前:这个想法是否因为我现在没有预见到的原因而存在缺陷?

2 个答案:

答案 0 :(得分:1)

  

这个想法有点瑕疵......?

首先,失败模式:正如您所猜测的,std::bitset可能会改变其内部表示。除此之外,无论如何不是(保证是)标准布局类型,因此初始写入是不明确的。除了 之外,你会怎么读回来?大概只是读入一个正确对齐的缓冲区并打字吗?这也是非法的。

其次,建议的修复:复制旧的<bitset>标题是可怕的。它不会成为实际标准库的一部分,并且仍将非法注入名称空间std。一些其他代码完全有可能使用原生std::bitset并导致可怕的错误。

最重要的是,当它与标准库的原生版本脱离时,它可能根本不起作用。

第三,正确的解决方案:

  1. (de)使用std::bitset

    的公共接口将其序列化为一些明确定义的格式

    请注意,这仍然是微不足道的:std::bitset::to_string已经存在,您可以从该字符串重构一个实例

  2. 编写一个由您控制的替换类,并保证可以轻松序列化。仅仅因为你没有免费获得std::bitset并不意味着你必须一起晃动使用原始字符数组。

答案 1 :(得分:0)

据我所知,通过将其写入文件,您的意思是获取std::bitset变量的地址并写入原始字节?在这种情况下,答案是。此过程称为实体序列化或实体编码,您不能实体序列化std::bitset(或任何包含它作为成员字段的类),因为std::bitset不是标准布局类型。