在位域整数和结构之间进行选择?
Choose between bit field integer versus struct?
假设需要将一组标志放在一起(在基于 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.) 如果您在这件事上有任何选择,您可能最好使用布尔掩码。
假设需要将一组标志放在一起(在基于 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.) 如果您在这件事上有任何选择,您可能最好使用布尔掩码。