簡體   English   中英

在C ++中有效使用布爾值true和false?

[英]Efficient use of boolean true and false in C++?

任何編譯器專家都能對布爾值的有效使用發表評論嗎? 具體來說,編譯器是否能夠優化std::vector<boolean>以使用最少的內存? 是否有一個等效的數據結構?

過去,有些語言的編譯器可以將布爾數組壓縮為每個布爾值僅一位的表示形式。 也許對C ++最好的方法是使用std::vector<char>來存儲布爾值以最小化內存使用量?

這里的用例將存儲數億個布爾值,其中一個字節將為每個值節省4個或更多字節的空間,而一個位甚至更多。

參見std::vector

專長

標准庫為bool類型提供了std :: vector的特殊化,已針對空間效率進行了優化。
vector <bool>空間高效的動態位集(類模板專門化)

和來自“ Working Draft C ++,2012-11-02”

23.3.7類向量[vector.bool]
1為了優化空間分配,提供了bool元素的vector的特殊化:
模板<class Allocator> class vector <bool,Allocator> {
...
}

3不需要將數據存儲為布爾值的連續分配。 建議使用空間優化的位表示形式。

因此,沒有必要(僅建議)將bool值存儲為位。

用於bool的std :: vector是一種模板專業化功能,可以滿足您的要求。

您可以在這里閱讀更多內容。

您可能還需要探索標准的bitset

注意, vector<bool>不是容器,但是它假裝為一個並提供迭代器。 有一天,如果您像對待普通容器一樣對待它,可能會造成混亂和錯誤,例如,嘗試獲取元素地址。

如果您需要為每個布爾值存儲1位,則可以考慮std::bitsetboost :: dynamic_bitset 這些數據結構並不假裝為容器,因此使用它們中的任何一個都不太可能出錯,尤其是在模板代碼中。

在標准中普遍認為的缺陷中, std :: vector專門用於使用單個位來表示每個bool值。

如果恰好是您要尋找的東西,請使用它。

作為保證有效存儲的與標准無關的方法,您可以創建自己的Bitvector類。 基本上,對於每8個bool值,您只需要分配一個char ,然后就可以將每個bool都存儲在一個位中。 然后,您可以在訪問器/更改器中使用位移技術來存儲/檢索您的單個位。

Ron Penton和AndréLaMothe的“ 面向游戲程序員數據結構” (我也建議將其作為一般的數據結構參考)中概述了一個這樣的示例。 編寫自己的書並不難,盡管我沒有花很長時間進行搜索,但互聯網上可能還有一些其他示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM