1

Abool在 C++ 中占用 1 个字节。但是,为什么 abool[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;
}

它返回“大小:8 字节”。

有没有办法优化它?

4

5 回答 5

7

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

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

如果布尔值被打包,p 和 q 会是什么?

于 2012-08-31T03:32:28.810 回答
2

首先 bool 的大小不能保证为 1。其次,当您将 8 个组合在一起时,为什么您仍然希望结果为 1?

8 x 1 = 8

于 2012-08-31T02:25:32.367 回答
1

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

为了方便地适当地设置字符串中的位,通常定义一些在语义上命名的常量并设置为 2 的幂的值(这样它们只会“翻转”一位。您可以轻松地使用位移运算符来明确哪个位被翻转:

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

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

if(userSettings & IS_ADMIN) { ...

这是一个起点wiki 文章

于 2012-08-31T02:29:30.390 回答
0

“有办法优化吗?”

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

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

于 2012-08-31T02:29:39.307 回答
0

有没有办法优化它?

您可以使用所谓的bit-field来做到这一点。位域值不能获取其地址。

于 2022-02-24T13:26:51.510 回答