簡體   English   中英

帶有手動位字段的內存保存與std :: bitset

[英]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甚至是intbool嗎? 除非您的資源非常有限(例如,MCU / DSP編程),否則我認為您不會。

那些玩位游戲的人將被咬,而那些玩字節游戲的人將被字節化。


順便說一句,您使用按位運算符聲明和操作的char bitField是一個位字段,但它不是位字段的C ++語言概念,它看起來像這樣:

struct BitField{
    unsigned char flag1 : 1, flag2 : 1, flag3 : 1;
}

寬松地說,它是一個數據結構,其數據成員被細分為單獨的變量。 在這種情況下,(大概)8位的unsigned char用於創建三個1位變量( flag1flag2flag3 )。 它被明確地細分了,但是到最后,這只是編譯器/語言輔助的擺弄,類似於上面的操作。 您可以在此處閱讀有關位字段的更多信息

暫無
暫無

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

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