布尔类型变量在内存中是如何存储的?(C++)

7

布尔类型变量 "test" 在使用 VS 2010 编译器时,如果每个 C++ 数据类型必须是可寻址的,则此变量占用 8 位(1 字节)。

我的问题是, "test" 变量是否真正占用了 1 字节的内存空间?

是否存在一些技巧可以使布尔数据类型只占用一个位?如果是,请给我举一个例子。

"test1" 是布尔类型数组,大小为 32,在 VS 2010 中;"test2" 是整型变量,在 VS 2010 中。

请问,"test1" 和 "test2" 是否占用相同的内存空间?


1
让我强调一下,当超级优化速度时,在32位机器上将布尔值存储在4个字节中可能是合理的。然后,如果您在结构中有4个布尔值,则仅需要进行单个ALU操作即可检查布尔值是否为真,而不是在一个机器字中打包多个布尔值时需要两个操作。(当然,这种微小差异通常根本不重要。) - Kos
一些嵌入式处理器实际上具有按位寻址的存储器,因此bool变量可以占用一个位。 - Thomas Matthews
3个回答

10
< p >每个test1元素都必须可寻址。这意味着数组test1(使用bool test1[32]创建)至少需要32字节(每个元素1字节)。< / p> < p >如果您想要在单个变量中存储多个布尔值,请使用std::bitsetstd::vector<bool>(但请注意,后者不是真正的布尔向量,它是为了节省空间而设计的特殊化类型)。< / p> < p >如果我没记错的话,C++11也定义了std::dynamic_bitset。< / p>

4
你可能是指32位,而不是32字节。 - Milan
2
如果处理器具有8位可寻址单元,那意味着bool必须占用1个八位字节(byte),而不是4个(32位)。是的,仍然存在8位可寻址系统。ARM9可以访问8位或32位值。 - Thomas Matthews
3
“test1”是一个由32个可寻址的布尔对象组成的数组,每个对象需要(至少)32字节存储空间。请注意,每个对象需要一个字节来存储。 - Mike Seymour
糟糕! - 没注意到。抱歉 :-) - Milan
1
@entity64:不,我的意思是32个字节,其中一个字节是最小存储单位(不一定是8位),这是C++标准规定的。 - Alexandre C.
1
两年后...是的,动态位集,当然。感谢<制定标准的人们>! - Serge Seredenko

3
我的问题是,“test”变量真的只占用1个字节的内存吗?
是的,如果sizeof(bool) == 1。基本上,bool的大小是由具体实现决定的,这意味着对于某些编译器,它可以大于1个字节。
bool test1[32](在VS 2010中),int test2(在VS 2010中) test1和test2占用相同的内存吗?
使用sizeof运算符可以知道它们各自占用的空间。这就是sizeof运算符的作用所在。因此,test1和test2将分别占用sizeof(test1)sizeof(test2)字节

2
另一个将变量定义为1位的可能性是将其放入位域结构中:
struct {
    int a:1;
    int b:1;
};

1
不应该是 unsigned a : 1 吗? - Xeo
嗯,我确信我是这样使用它的,尽管我从未将其视为1位有符号整数,所以你说得对。 - Michael Krelin - hacker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接