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)”。
有没有办法优化它?
答案 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)