鑑於我有一個可能處於一個或多個真/假狀態的對象,我總是對模塊爲什麼經常使用標誌+位掩碼而不是使用多個布爾值有點模糊。爲什麼使用標誌+位掩碼而不是一系列布爾值?
它遍佈.NET框架。不知道這就是最好的例子,但在.NET框架有以下幾點:
public enum AnchorStyles
{
None = 0,
Top = 1,
Bottom = 2,
Left = 4,
Right = 8
}
所以給出一個錨的風格,我們可以使用位掩碼來找出哪些國家的選擇。但是,您似乎可以使用爲每個可能的值定義的bool屬性或單個枚舉值數組的AnchorStyle類/結構完成相同的操作。
當然,我的問題的主要原因是,我想知道如果我應該按照我自己的代碼類似的做法。
那麼,爲什麼要使用這種方法呢?
- 內存消耗較少? (它不是似乎喜歡它會消耗比bools的數組/結構更少)
- 比結構或數組更好的堆棧/堆性能?
- 更快的比較操作?更快的增值/刪除?
- 對於編寫它的開發者來說更方便嗎?
不是說我發現了一個強有力的論點,但它確實消耗了更少的內存。它使用一個int(4字節),而每個布爾使用一個字節。所以,4個布爾使用相同的一個int。 32個布爾最多使用32個字節,而所有這些布爾可以使用相同的枚舉。如果你去不推薦的路徑,你可以使枚舉長8個字節(sizeof(long))。 – 2009-09-10 17:16:41
感謝您澄清。它引導我到這篇文章:http://stackoverflow.com/questions/294905/why-in-net-system-boolean-takes-4-byte – 2009-09-10 21:38:54
所以從響應很明顯,枚舉標誌比結構更輕量級/內存方面的布爾數組。但是,似乎也有一些.NET框架類可以很好地適用於該任務,例如BitVector32或BitArray。如何使用BitVector32(由uint支持)進行存儲並提供在特定索引處獲取/設置位(如bools)的屬性? Windows窗體似乎這樣做。爲開發人員提供更多代碼,但看起來它會表現良好,並且封裝將使下游API消費者更容易使用。嗯? – 2009-09-10 21:40:58