[英]Memory Conservation with Manual Bit Fields vs. std::bitset
我正在學習位標志,並使用按位運算符手動創建位字段。 然后,我遇到了位集,這似乎是一種存儲位域的更輕松,更干凈的方法。 我了解使用位字段的價值,可以最大程度地減少內存使用。 在測試了sizeof(bitset)之后,我很難理解這是一種更好的方法。
考慮:
#include <bitset>
#include <iostream>
int main ()
{
// Using Bit Set, Size = 8 Bytes
const unsigned int i1 = 0;
const unsigned int i2 = 1;
std::bitset<8> mySet(0);
mySet.set(i1);
mySet.set(i2);
std::cout << sizeof(mySet) << std::endl;
// Manually managing bit flags
const unsigned char t1 = 1 << 0;
const unsigned char t2 = 1 << 1;
unsigned char bitField = 0;
bitField |= t1 | t2;
std::cout << sizeof(bitField) << std::endl;
return 0;
}
輸出為:
mySet是8個字節。 bitField是1個字節。
如果需要最小的內存使用量,是否應該不使用std :: bitset?
為了盡可能減少內存占用,您不應使用std::bitset
。 它可能需要比普通內置類型(如char
或等效有效大小的int
更多的內存。 因此,它可能具有內存開銷,但是多少將取決於實現。
std::bitset
一個主要優點是它使您擺脫了各種類型的依賴於硬件的實現。 從理論上講,硬件可以滿足任何類型的任何表示形式,只要它滿足C ++標准中的某些要求即可。 因此,當您在內存中將unsigned char t1 = 1
依賴為00000001
時,實際上並不能保證。 但是,如果您創建一個位集並正確對其進行初始化,則不會給您帶來任何令人討厭的驚喜。
關於位擺弄的旁注:考慮到以這種方式擺弄位的陷阱,您真的可以證明這種容易出錯的方法而不是使用std::bitset
甚至是int
和bool
嗎? 除非您的資源非常有限(例如,MCU / DSP編程),否則我認為您不會。
那些玩位游戲的人將被咬,而那些玩字節游戲的人將被字節化。
順便說一句,您使用按位運算符聲明和操作的char bitField
是一個位字段,但它不是位字段的C ++語言概念,它看起來像這樣:
struct BitField{
unsigned char flag1 : 1, flag2 : 1, flag3 : 1;
}
寬松地說,它是一個數據結構,其數據成員被細分為單獨的變量。 在這種情況下,(大概)8位的unsigned char
用於創建三個1位變量( flag1
, flag2
和flag3
)。 它被明確地細分了,但是到最后,這只是編譯器/語言輔助的擺弄,類似於上面的操作。 您可以在此處閱讀有關位字段的更多信息 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.