我在位域中塞满了一堆属性以节省空间:
struct Flags {
uint access : 2;
uint status : 2;
uint isEnabled : 1;
uint isDeletable: 1;
...
};
然后,我有一个静态的Flags defaultFlags
程序启动时初始化的。我的主要问题是flags = defaultFlags;
在对象构造函数中是否安全,以便消除用于分别分配每个字段的20行?
另外,我想知道序列化怎么办?根据编译器的说法,它Flags
是4个字节,我可以将其序列化为32位无符号整数并对其进行反灭菌处理而不会造成任何数据损坏吗?
我的主要问题是标记= defaultFlags是否安全?在对象构造函数中,为了消除单独分配每个字段的20行?
是的。隐式定义的副本构造函数Flags
将适当地分配每个Bitfield。[class.copy] / 15:
每个基本或非静态数据成员都按照适合其类型的方式进行复制/移动:
- 如果成员是数组,则[..]
- 如果成员
m
具有右值引用类型T && [..]- 否则,将使用的相应
基础或成员直接初始化该基础或成员x
。
我如何将其序列化为32位无符号整数并对其进行反灭菌处理而没有任何数据损坏?
如果在具有相同编译程序的同一台计算机上读写文件,则可以。尽管其他编译器或体系结构的布局可能有所不同,但该标准并未在这方面强加任何固定要求。[class.bit] / 1:
类对象内的位域分配由实现定义。位域的对齐由实现定义。位字段打包到一些可寻址的分配单元中。[注意:在某些机器上位域跨越分配单元,而在其他机器上则不。在某些计算机上,位字段是从右到左分配的,在其他计算机上是从左到右分配的。—尾注]
如果将其写入char
大小数组,则将其sizeof Field
写入文件,然后再次从文件中提取出来,然后将其复制回Field
对象应具有相同的值。[basic.types] / 2(重点是我的):
对于任何可复制类型的对象(基类子对象除外)
T
,无论该对象是否具有有效的type值,T
都可以将构成对象的基础字节(1.7)复制到char
or的数组中unsigned char
。如果或数组的内容被复制回对象,则对象随后应保留其原始值。char
unsigned char
但是,正如评论中指出的那样,使用位掩码可以实现完全的可移植性(和合理的效率)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句