位域分配 - 是否安全
Bitfield assignment - is it safe?
我有一个位域中塞满了一堆属性以节省空间:
struct Flags {
uint access : 2;
uint status : 2;
uint isEnabled : 1;
uint isDeletable: 1;
...
};
然后我有一个静态Flags defaultFlags
,它在程序启动时初始化。我的主要问题是,为了消除单独分配每个字段的 20 行,在对象构造函数中flags = defaultFlags;
是否安全?
另外,我想知道序列化呢?根据编译器的说法,Flags
是 4 个字节,我可以将其序列化为 32 位无符号整数并对其进行解密而不会损坏任何数据吗?
我的主要问题是标志 = defaultFlags 是否安全; 在 对象构造函数,以消除用于赋值的 20 行 每个字段单独?
是的。Flags
的隐式定义复制构造函数将相应地分配每个位字段。[类副本]/15:
每个基本或非静态数据成员都按以下方式复制/移动 适合其类型:
- 如果成员是数组,则 [..]
- 如果成员
否则,基或成员m
具有右值引用类型 T&& [..]- 使用
x
的相应
基或成员直接初始化。
我可以将其序列化为 32 位无符号整数并将其取消灭菌为 这样没有任何数据损坏?
如果您使用相同的编译程序在同一台计算机上写入和读取文件,是的。不过,其他编译器或体系结构的布局可能有所不同,该标准在这方面没有施加任何固定的要求。[class.bit]/1:
类对象中位字段的分配为 实现定义。位字段的对齐方式为 实现定义。位字段被打包到一些可寻址的 分配单元。[ 注意:位域跨分配单元 有些机器而不是其他机器。位字段从右到左分配 在某些计算机上,在其他计算机上从左到右。— 尾注 ]
如果您将其写入大小为 sizeof Field
的 char
数组,将其写入文件并从那里再次提取,将其复制回 Field
对象应该会给您相同的值。[基本类型]/2(强调我的):
对于任何对象(基类子对象除外)的微不足道 可复制类型
T
,无论对象是否具有有效的类型值T
,可以复制构成对象的基础字节(1.7) 成char
或unsigned char
数组。如果内容 将char
或unsigned char
数组复制回对象中, 对象随后应保持其原始值。
但是,正如评论中指出的那样,使用位掩码可以实现完全可移植性(和合理的效率)。
- 通过网络、跨平台传递std::变体是否安全
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 在函数结束后使用指向变量的指针是否安全?
- 逐字节删除 void* 是否安全?
- 在 RAII 构造中修改 RVO 值是否安全?
- 线程调用的函数对对象删除是否安全?
- 将对象的字节复制到数组并再次复制回来是否安全
- std::memmove在同一对象之间是否始终安全
- 使用枚举为数组编制索引是否安全?
- 返回从字符串文本创建的静态string_view是否安全?
- 在cstlib中将#include_next替换为#include是否安全
- 由并发无序映射查找线程调用的函数是否安全?
- 使用 c++ 原子时编写"y=++x"是否安全?
- 从另一个线程发出信号是否安全?
- 从其存储的回调中删除 std::函数是否安全
- 使用 std::vector::swap 方法在C++中交换两个不同的向量是否安全?
- 当我在C++中调用 struce 的只读静态成员时,线程是否安全
- 同时调用 ASIO 对象的 API 是否安全?