我有一系列需要许多布尔字段的类,介于4-10之间。我不想为每个布尔值使用一个字节。我一直在研究比特字段结构,例如:
struct BooleanBitFields
{
bool b1:1;
bool b2:1;
bool b3:1;
bool b4:1;
bool b5:1;
bool b6:1;
};
但在做了一些研究之后,我看到很多人都说这会导致内存访问效率低下,而且不值得节省内存。我想知道这种情况的最佳方法是什么。我应该使用位字段,还是使用带掩码的字符(和和或 s)存储8位?如果第二种解决方案是更好的位移或使用逻辑?
如果有人可以评论他们会使用什么方法,以及为什么它会真正帮助我决定我应该走哪条路。
提前致谢!
答案 0 :(得分:2)
由于桌面盒上的地址空间很大,32/64位布尔数组可能看起来很浪费,事实上确实如此,但大多数开发人员并不关心,(包括我)。在RAM限制的嵌入式控制器上,或在访问驱动程序中的硬件时,请确保使用位域,否则..
除了R / W简易/速度之外,另一个问题是32位或64位布尔值比中间的一位线程更安全,必须由多个逻辑运算来操作。
答案 1 :(得分:2)
位字段仅是编译器的推荐。编译器可以随意实现它们。在嵌入式系统上,有一些编译器可以保证1位到位的映射。其他编译器没有。
我会使用常规结构,就像你的结果,但没有位字段。使它们成为无符号字符 - 最短的数据类型。如果您的IDE支持自动完成,那么结构将使编辑时更容易访问它们。
答案 2 :(得分:1)
使用int位数组(留下很多空间来扩展,并且单个char没有优势)并使用掩码常量进行测试:
#define BOOL_A 1
#define BOOL_B 1 << 1
#define BOOL_C 1 << 2
#define BOOL_D 1 << 3
/* Alternately: use const ints for encapsulation */
// declare and set
int bitray = 0 | BOOL_B | BOOL_D;
// test
if (bitray & BOOL_B) cout << "Set!\n";