2009-11-07 36 views
2

使用枚舉在C++中存儲位標記有點麻煩,因爲一旦枚舉值被「或」,它們就會失去它們的枚舉類型,這會導致錯誤,而不會顯式轉換。C++中的Bitflag枚舉

this question接受的答案建議重載|操作:

FlagsSet operator|(FlagsSet a, FlagsSet b) 
{ 
    return FlagsSet(int(a) | int(b)); 
} 

我想知道,如果這種方法有任何運行時的影響?

+0

+1因爲我還不知道這個技術。 – StackedCrooked 2009-11-07 17:56:55

回答

5

正確性方面的運行時間影響?不 - 這應該是你想要的。

速度方面的運行時間影響?我希望任何體面的編譯器都能夠正確地優化這個版本,儘可能減少構建版本的最少數量的指令(儘管您可能只想確定添加inline)。

+2

+1。關於'inline':智能編譯器會自行決定忽略關鍵字和內聯代碼;現在爲了性能原因標記函數通常是毫無用處的。然而,假設函數是在頭文件中定義的,添加'inline'的理由非常不同。 – avakar 2009-11-07 16:43:39

0

它可能會執行三個副本和一個函數調用,禁止RVO,註冊和/或內聯優化。

裸露的按位或操作本身通常會分解爲單個處理器指令。

+0

不僅*可能*不是瓶頸,但你承認自己編譯器可以足夠聰明來優化這些東西。 – rlbond 2009-11-07 16:38:47

0

該代碼是正確的。

代碼的速度與未進行類型轉換的速度相同。

但是代碼是否快速是無關緊要的,因爲名爲'FlagSet'的類型很可能會在條件測試( - >「if(Flag)」)的情況下使用,這對於速度而不是寄存器大小的兩個值中的「或」。

1

使用std :: bitset爲您的位標誌...更簡單;) 或boost :: dynamic_bitset。