让我们说需要将一组标志放在一起(使用基于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;
答案 0 :(得分:2)
Bitfields是一种奇怪的,不经常使用的语言功能,因此很多编译器都遇到了麻烦。 (Here's one example; here's another。)如果您对此事有任何选择,最好使用布尔值掩码。
答案 1 :(得分:1)
两者在运行时都是等效的。前者需要特定于编译器的属性,并且更难创建值。