簡體   English   中英

為什么 std::vector<bool> 沒有 .data() 嗎?

[英]Why does std::vector<bool> have no .data()?

C++11 23.3.7/1 中指定的std::vector<bool>特化沒有聲明data()成員(例如在此處此處提到)。

問題是:為什么std::vector<bool>沒有.data() 這與為什么bool s 的向量沒有連續存儲在內存中的問題完全相同。 不這樣做有什么好處?

為什么不能返回指向bool數組的指針?

為什么 std::vector 沒有 .data()?

因為std::vector<bool>在 1 個字節中存儲多個值。

把它想象成一個壓縮存儲系統,其中每個布爾值都需要 1 位。 因此,不是每個內存塊一個元素(每個數組單元一個元素),內存布局可能如下所示:

在此處輸入圖片說明

假設您想索引一個塊以獲得一個值,您將如何使用運算符[] 它不能返回bool& (因為它將返回一個字節,它存儲多個bools ),因此您不能為其分配bool* 換句話說bool *bool_ptr =&v[0]; 不是有效代碼,會導致編譯錯誤。

此外,正確的實現可能沒有這種專業化並且不進行內存優化(壓縮)。 因此data()必須根據實現復制到預期的返回類型(或者標准應該強制優化而不是僅僅允許它)。

為什么不能返回指向布爾數組的指針?

因為std::vector<bool>存儲為std::vector<bool>數組,因此不能以直接的方式返回指針。 它可以通過將數據復制到數組並返回該數組來做到這一點,但不這樣做是一種設計選擇(如果他們這樣做了,我會認為這可以作為所有容器的data() ,這會產生誤導) .

不這樣做有什么好處?

內存優化。

通常內存使用量減少 8 倍,因為它在單個字節中存儲了多個位。 准確地說, CHAR_BIT時間要少一些。

暫無
暫無

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

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