8 bool vs 1 int

8 bool vs 1 int

本文关键字:int vs bool      更新时间:2023-10-16

bool在C++中占用1个字节。但是,为什么bool[8]需要8个字节而不是1个字节呢?一个字节有足够的空间容纳8位。

我使用-Os标志用GCC编译了这个:

#include <iostream>
using namespace std;
class Foo
{
    public:
        bool m_bool[8];
};
int main ()
{
    cout << "Size: " << sizeof(Foo) << " byte(s) " << endl;
   return 0;
}

它返回"Size:8 byte(s)"。

有没有优化它的方法?

编译器必须允许您获取单个布尔的地址,例如

Foo foo;
bool* p = &foo.m_bool[0];
bool* q = &foo.m_bool[1];

如果bools被打包了,p和q会是什么?

不能保证第一个bool的大小为1。第二,当你把8个组合在一起时,为什么你仍然期望结果是1?

8 x 1=8

由于我在上面的评论中没有看到它,我将在回答"有没有优化它的方法?"时提到一个概念,以防您还没有使用它。它被称为位掩码,其中您基本上使用int作为一系列位,并使用逐位运算符来计算整数中的各个位。

为了方便地适当地设置字符串中的位,通常定义一些语义命名的常量,并将其设置为2的幂值(这样它们只"翻转"一位。您可以很容易地使用bitshift运算符来明确翻转的位:

#define IS_ADMIN = 1<<0;
#defing CLEAR_CACHE = 1<<1;

然后你测试这样的管理员:

if(userSettings & IS_ADMIN) { ...

这是一篇起点维基文章

"有办法优化它吗?"

你确定优化是有益的吗?您可以使用枚举作为标志而不是布尔来将它们全部存储在一个字节中。

如何在C++中使用枚举作为标志?

有没有优化它的方法?

您可以使用所谓的位字段来实现这一点。位字段值不能取其地址。