假设需要将一组几个标志放在一起(在基于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;
位字段是一种奇怪且不常使用的语言特性,因此许多编译器都会遇到问题。(这是一个例子;这是另一个例子。)如果你在这件事上有任何选择,你可能最好使用布尔掩码。
两者在运行时是等效的。然而,前者需要编译器特定的属性,并且更难创建值。