2016-04-13 43 views
0

我需要将文件存储在文件中,并且std::bitset对此很适合,因为当我再次读取结构时,我需要很多操作。这个类似乎只包含一些数组,而没有其他成员数据。可以在从磁盘写入和读取的结构中使用std :: bitset吗?

所以不是这个

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

我能有这样的:

std::bitset<60 * 24> minuteOfDay; 

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

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

+0

所以,要清楚,你不在乎它是否应该工作或保证工作,你只是在乎它是否正常工作?如果是这样,为什么不测试? –

+0

您仍然需要存储并阅读[基础类型](http://en.cppreference.com/w/cpp/utility/bitset/to_ullong),这是您可以使用的最小单位。 –

+0

我正在测试它,它看起来很好。 @πάνταῥεῖ你是什么意思? –

回答

1

这个想法不知何故有缺陷...?

是的。

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

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

最重要的是,它可能根本无法与标准库的本地版本脱离。

第三,正确的解决方案:要么

  1. (DE)它序列化到一些良好定义的格式,使用std::bitset

    音符的公共接口,这是相当琐碎反正:std::bitset::to_string已经存在,你可以从该字符串重新构造一个实例

  2. 写一个由你控制的替代类,保证是琐事lly可序列化。只是因为你没有得到std::bitset免费并不意味着你必须邦加岩石使用原始字符阵列。
0

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

+0

那么,至少使用gcc和clang'std :: bitset' [是标准布局](http://coliru.stacked-crooked.com/a/931a854f36867094),所以说*不能保证*是更正确的标准布局。另外'struct S {int * ptr; };'是标准布局,但你也不想实体序列化它。 –

+0

@AntonSavin,第一点对我来说实际上是一样的。一旦标准被调用,不保证,并且不是相似的权重。在第二部分,它在语义上是不正确的,但是如果你在同一个程序中序列化/反序列化它,它至少会产生定义良好的结果。非标准布局类型没有这个特性。 – SergeyA

相关问题