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

10-01 01:43