4

我有一系列需要许多布尔字段的类,介于 4-10 之间。我不想为每个布尔值使用一个字节。我一直在研究位字段结构,例如:

struct BooleanBitFields
    {
        bool b1:1;
        bool b2:1;
        bool b3:1;
        bool b4:1;
        bool b5:1;
        bool b6:1;
    };

但是在做了一些研究之后,我看到很多人说这会导致内存访问效率低下,不值得节省内存。我想知道这种情况下最好的方法是什么。我应该使用位字段,还是使用带有位掩码(and's and or s)的字符来存储 8bits?如果第二种解决方案是移位还是使用逻辑更好?

如果有人可以评论他们将使用什么方法以及为什么它真的会帮助我决定我应该走哪条路线。

提前致谢!

4

3 回答 3

1

使用一个 int 位数组(为您留出大量空间来扩展,并且单个字符没有优势)并使用掩码常量进行测试:

#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-21T19:04:45.727 回答
1

由于桌面设备上的地址空间很大,一组 32/64 位布尔值可能看起来很浪费,确实如此,但大多数开发人员并不在意,(包括我在内)。在 RAM 受限的嵌入式控制器上,或者在访问驱动程序中的硬件时,请确保使用位域,否则......

除了 R/W 轻松/速度之外,另一个问题是 32 位或 64 位布尔值比必须由多个逻辑操作操作的中间一位更线程安全。

于 2012-04-21T19:06:31.233 回答
1

位域只是编译器的建议。编译器可以随意实现它们。在嵌入式系统上,有编译器可以保证 1 位到位的映射。其他编译器没有。

I would go with a regular struct, like yours but no bit fields. Make them unsigned chars - the shortest data type. The struct will make it easier to access them while editing, if your IDE supports auto completion.

于 2012-04-21T19:10:03.757 回答