C++ 如何将位字段专门用于以下目的

C++ 如何将位字段专门用于以下目的,c++,bit-fields,C++,Bit Fields,为了学习高效内存管理,我想知道如何使用单个位字段来表示8个布尔值的值,以及如何评估和设置每个位 原因是在我自己的程序中,我不会粘贴,因为有数千行。 在类的全局范围内,大约有100个布尔值都是必需的,这对FPS影响很大 例如: uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1; if (!b0) { // do something b0 = true; } 只能

为了学习高效内存管理,我想知道如何使用单个位字段来表示8个布尔值的值,以及如何评估和设置每个位

原因是在我自己的程序中,我不会粘贴,因为有数千行。 在类的全局范围内,大约有100个布尔值都是必需的,这对FPS影响很大

例如:

       uint8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;

       if (!b0) { 
       // do something
       b0 = true; 
       }

只能为数据成员指定位字段。从第一行开始:

声明具有显式大小[…]的类数据成员

您需要将位字段包装到结构中。例如:

#include <cstdint>
struct bool_pack {
    uint8_t b0 : 1, b1 : 1, b2 : 1, b3 : 1, b4 : 1, b5 : 1, b6 : 1, b7 : 1;
};

int main()
{
    bool_pack b = {};

    if (!b.b0) {
        // do something
        b.b0 = true;
    }
}

请注意,访问位并不是一件小事,而且在节省空间的同时,代码复杂度和速度往往会增加一倍。还要注意的是,std::vector专门为每个值使用1位,因此这项工作已经为您完成。只需使用位操作即可。还记得数字逻辑吗?开/关(异或)
b0^=1
打开/关闭谢谢@NathanOliver是的,我理解,这样做代码复杂性是一个问题。谢天谢地,这是整个程序的一个类,我希望在这里实现。@tadman谢谢,我从来没有想过采取这种方法,在这里的各种回答之间,似乎有一些关于任务的常见做法。感谢您提供了一个真正的下降示例,我将对此进行研究。
#include <bitset>
int main()
{
    std::bitset<8> b;

    if (!b[0]) {
        // do something
        b[0] = true;
    }
}