c-在位字段整数和结构之间进行选择



假设需要将一组几个标志放在一起(在基于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;

位字段是一种奇怪且不常使用的语言特性,因此许多编译器都会遇到问题。(这是一个例子;这是另一个例子。)如果你在这件事上有任何选择,你可能最好使用布尔掩码。

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

最新更新