在字段整数与结构之间进行选择?

时间:2015-02-11 02:17:17

标签: c performance struct enums

让我们说需要将一组标志放在一起(使用基于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;

2 个答案:

答案 0 :(得分:2)

Bitfields是一种奇怪的,不经常使用的语言功能,因此很多编译器都遇到了麻烦。 (Here's one example; here's another。)如果您对此事有任何选择,最好使用布尔值掩码。

答案 1 :(得分:1)

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