What is the performance of std::bitset?

后端 未结 5 449
你的背包
你的背包 2020-12-24 05:24

I recently asked a question on Programmers regarding reasons to use manual bit manipulation of primitive types over std::bitset.

From that discussion I

5条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-24 05:45

    In addition to what the other answers said about the performance of access, there may also be a significant space overhead: Typical bitset<> implementations simply use the longest integer type to back their bits. Thus, the following code

    #include 
    #include 
    
    struct Bitfield {
        unsigned char a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1;
    };
    
    struct Bitset {
        std::bitset<8> bits;
    };
    
    int main() {
        printf("sizeof(Bitfield) = %zd\n", sizeof(Bitfield));
        printf("sizeof(Bitset) = %zd\n", sizeof(Bitset));
        printf("sizeof(std::bitset<1>) = %zd\n", sizeof(std::bitset<1>));
    }
    

    produces the following output on my machine:

    sizeof(Bitfield) = 1
    sizeof(Bitset) = 8
    sizeof(std::bitset<1>) = 8
    

    As you see, my compiler allocates a whopping 64 bits to store a single one, with the bitfield approach, I only need to round up to eight bits.

    This factor eight in space usage can become important if you have a lot of small bitsets.

提交回复
热议问题