8 bool vs 1 int

时间:2012-08-31 02:12:31

标签: c++ sizeof

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

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

#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)”。

有没有办法优化它?

4 个答案:

答案 0 :(得分:6)

编译器必须允许您获取各个bool的地址,例如

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

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

答案 1 :(得分:2)

首先,bool不能保证大小为1.当你将8个组合在一起时,为什么你仍然期望结果为1?

8 x 1 = 8

答案 2 :(得分:1)

由于我在上面的评论中没有看到它,我会提到一个概念,以回应“有没有办法优化它?”万一你尚未使用它。它被称为 bitmasking ,您实际上将 int 用作一系列位,并使用按位运算符来计算整数中的各个位。

为了方便地设置字符串中的位,通常定义一些语义命名的常量并设置为2的幂值(这样它们只能“翻转”一位。你可以很容易地使用 bitshift 运算符,以明确显示哪个位被翻转:

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

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

if(userSettings & IS_ADMIN) { ...

这是一个起点wiki article

答案 3 :(得分:0)

“有没有办法优化它?”

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

How to use enums as flags in C++?