在位域整数和结构之间进行选择?

Choose between bit field integer versus struct?

假设需要将一组标志放在一起(在基于 C 的语言中),有两种选择:使用 struct 位字段或使用初始化枚举。就 运行 时间性能而言,哪一个更有效?该选项暗示的注意事项是什么?

选项A:

typedef struct {
    unsigned int onion : 1; 
    unsigned int pickle : 1;
    unsigned int jalapeno : 1;
    unsigned int cucumber : 1;
} __attribute__((packed)) SandwichVegetable;

选项A的用法示例,假设您只想要洋葱和泡菜,我们默认有零初始化结构:

SandwichVegetable mine;
mine.onion = 1;
mine.pickle = 1;

选项 B:

typedef enum {
    SandwichVegetableOnion = 1,
    SandwichVegetablePickle = 1 << 2,
    SandwichVegetableJalapeno = 1 << 3,
    SandwichVegetableCucumber = 1 << 4
} SandwichVegetable;

作为选项 B 的示例,同样,如果我们只想拥有洋葱和泡菜,我们又让编译器将所有内容初始化为零:

SandwichVegetable mine;
mine = SandwichVegetableOnion | SandwichVegetablePickle;

两者在运行时是等价的。然而,前者需要特定于编译器的属性并且更难创建值。

位域是一种奇怪且不常用的语言特性,因此许多编译器都难以处理它们。 (Here's one example; here's another.) 如果您在这件事上有任何选择,您可能最好使用布尔掩码。