2015-02-11 48 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

兩者在運行時都是等效的。然而,前者需要編譯器特定的屬性,並且很難創建值。