假设需要将几个标志集合在一起(使用基于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。)如果您有任何选择,最好使用布尔掩码。