2015-02-11 37 views
-2

假设需要将一组标志保持在一起(使用基于C的语言),有两种方法可以实现这一点:使用位字段的struct或使用初始化枚举。哪一个在运行时间性能方面更高效,以及该选项意味着什么?在位域整数与结构之间选择?

选项A:选项A的

typedef struct { 
    unsigned int onion : 1; 
    unsigned int pickle : 1; 
    unsigned int jalapeno : 1; 
    unsigned int cucumber : 1; 
} __attribute__((packed)) SandwichVegetable; 

用法举例来说,假设你想有只洋葱,泡菜,我们有零初始化结构默认:

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; 
+0

选项2我喜欢,但这是我的意见。这是基于意见的,除非有人能够公开一个好的理由,我选择选项2是因为它清楚了你在做什么。 – 2015-02-11 02:20:50

+0

您可以使用枚举更轻松地查找随机值集合。在运行时决定寻找墨西哥胡椒,黄瓜和酱菜(可能)比单独访问位域更容易。比特字段是非常实现定义的,并且容易导致比您预期的更大的代码。 – 2015-02-11 02:21:16

回答

2

位域是一种奇怪而且很少使用的语言特性,因此很多编译器遇到了麻烦。 (Here's one example; here's another。)如果您在此问题上有任何选择,您可能最好使用布尔型掩码。

1

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