我有一系列的类,它们需要很多布尔型字段,大概在4-10之间。我希望不必为每个布尔值使用一个字节。我一直在研究位字段结构,比如:
struct BooleanBitFields
{
bool b1:1;
bool b2:1;
bool b3:1;
bool b4:1;
bool b5:1;
bool b6:1;
};
但在做了一些研究后,我看到很多人说这会导致低效的内存访问,不值得节省内存。我想知道在这种情况下最好的方法是什么。我应该使用位字段,还是使用带有位掩码的字符(和或s)来存储8位?如果是第二种解决方案,位移位和使用逻辑哪个更好?
如果有人能评论一下他们会使用什么方法,以及为什么这真的会帮助我决定我应该走哪条路线。
提前感谢!
发布于 2012-04-22 03:06:31
由于台式机上的地址空间很大,32/64位布尔值的数组可能看起来很浪费,确实如此,但大多数开发人员并不关心(包括我在内)。在RAM受限的嵌入式控制器上,或者在访问驱动程序中的硬件时,请务必使用位域,否则..
除了R/W ease/speed之外,另一个问题是32位或64位布尔值比必须由多个逻辑操作操作的中间位更安全。
发布于 2012-04-22 03:04:46
使用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";
发布于 2012-04-22 03:10:04
位字段只是编译器的推荐字段。编译器可以随心所欲地实现它们。在嵌入式系统中,有些编译器可以保证1位到位的映射。其他编译器则不这样做。
我会使用一个常规的结构,就像你的一样,但是没有位字段。使它们成为无符号字符-最短的数据类型。如果您的IDE支持自动完成,该结构将使您在编辑时更容易访问它们。
https://stackoverflow.com/questions/10261983
复制相似问题