Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ bool类型变量如何存储在内存中?(C+;+;)_C++_Boolean - Fatal编程技术网

C++ bool类型变量如何存储在内存中?(C+;+;)

C++ bool类型变量如何存储在内存中?(C+;+;),c++,boolean,C++,Boolean,布尔试验 sizeof(test)=1如果使用VS 2010。因为每个C++数据类型必须是可寻址的, “test”bool变量为8位(1字节) 我的问题是,“test”变量是否真的占用内存中的1字节 是否有任何实现技巧可以使bool数据类型只占一部分 一点点?如果是,你能给我举个例子吗 booltest1[32](在VS 2010中), inttest2(VS 2010) test1和test2是否占用相同的内存?test1的每个元素都必须是可寻址的。这意味着数组test1(使用booltest

布尔试验

sizeof(test)=1
如果使用VS 2010。因为每个C++数据类型必须是可寻址的, “test”bool变量为8位(1字节)

我的问题是,“test”变量是否真的占用内存中的1字节

是否有任何实现技巧可以使bool数据类型只占一部分 一点点?如果是,你能给我举个例子吗

booltest1[32]
(在VS 2010中),
inttest2
(VS 2010)


test1
test2
是否占用相同的内存?

test1的每个元素都必须是可寻址的。这意味着数组
test1
(使用
booltest1[32]
创建)至少需要32个字节(每个元素1个字节)

如果希望在单个变量中存储多个布尔值,请使用
std::bitset
std::vector
(但请注意,后者实际上不是布尔向量,它是为节省空间而专门设计的)

IIRC,C++11还定义了
std::dynamic_位集

我的问题是,“test”变量是否真的占用内存中的1字节

是,如果
sizeof(bool)==1
。基本上,sizeof bool是实现定义的,这意味着对于某些编译器,它可能大于1字节

bool test1[32](VS 2010),int test2(VS 2010)
test1和test2占用相同的内存吗


通过使用sizeof运算符可以知道它们各自占用的空间。这就是sizeof操作符的作用。因此
test1
test2
将分别占用
sizeof(test1)
sizeof(test2)
字节。

另一种可能是将1位变量放入位字段结构中:

struct {
    int a:1;
    int b:1;
};

我要强调的是,当超级优化速度时,平台在32位机器上以4字节存储布尔值是合理的。然后,如果一个结构中有4个布尔值,那么只需要一个ALU操作来检查布尔值是否为真,而在一个机器字中包含多个布尔值时,只需要两个ALU操作。(Ofc如此小的差异通常一点都不重要。)一些嵌入式处理器实际上有位可寻址内存,因此bool变量可以占用一位。您可能指的是32位,而不是字节如果处理器有8位可寻址单元,这意味着
bool
必须占用1个八位(字节),而不是4个八位(32位)。是的,现在仍然有8位可寻址系统。ARM9可以访问8或32位值。@ EntItHelo:< Cord> Test1是一个32可寻址的代码<代码> Boo.< /Cord>对象,它至少需要32字节,每个对象需要一个。@ ItNyth64:不,我是指32字节,其中字节是由C++标准强制执行的最小存储单元(不一定是8位)。2年后…是的,动态比特集,当然。谢谢你!它不应该是无符号的a:1吗?我确信我是这样使用它的,尽管我从未将它视为1位有符号整数,所以这里有一点。