为什么字符和布尔在c++;? 我正在读C++程序设计语言。在它的Stroustrup声明中,sizeof(char)=1和1

为什么字符和布尔在c++;? 我正在读C++程序设计语言。在它的Stroustrup声明中,sizeof(char)=1和1,c++,boolean,C++,Boolean,占用相同的空间,因为您可以在内存中写入的最小空间量是一个字节。这两个值都存储在一个字节中。虽然理论上只需要1位来表示布尔值,但仍然需要一个完整的字节来存储该值。理论上,布尔值只需要一位,但处理少于1字节的数据是很麻烦的。你需要更多的指导来完成任何事情,但你并没有真正受益 如果你想将多个布尔值打包成一个字节,你可以使用一个。在现代计算机体系结构中,一个字节是最小的可寻址内存单元。要将多个位打包到一个字节中,需要应用额外的位移位操作。在编译器级别,这是内存与速度需求的权衡(在高性能软件中,这些额外的

占用相同的空间,因为您可以在内存中写入的最小空间量是一个字节。这两个值都存储在一个字节中。虽然理论上只需要1位来表示布尔值,但仍然需要一个完整的字节来存储该值。

理论上,布尔值只需要一位,但处理少于1字节的数据是很麻烦的。你需要更多的指导来完成任何事情,但你并没有真正受益


如果你想将多个布尔值打包成一个字节,你可以使用一个。

在现代计算机体系结构中,一个字节是最小的可寻址内存单元。要将多个位打包到一个字节中,需要应用额外的位移位操作。在编译器级别,这是内存与速度需求的权衡(在高性能软件中,这些额外的位移位操作可以不必要地增加和减慢应用程序)。

< P>因为在C++中,您可以选择布尔的地址,大多数机器不能处理单个位。在我所知道的大多数实现中,sizeof(bool)==sizeof(int)。“int”是CPU最有效的数据大小。因此,没有特定大小的东西(如“char”)与int的大小相同。如果每个对象都有大量的字符,则可能需要实现一种打包存储的方法,但在正常计算过程中,它应该是原生大小。

C++中有这样一个东西,它试图利用一个事实,你可以在理论上存储8个布尔值,但它被C++标准委员会广泛认为是错误的。《有效stl》一书实际上说“不要使用它”。这会让你知道这有多棘手


顺便说一句:Knuth有一个专门用于按位操作的工具。Boost还有一种专用于以更高效的方式处理大量位的方法。

字节是最小的可寻址内存单元

考虑以下代码:

    bool b[9];
    bool *pb0 = &b[0];
    bool *pb1 = &b[1];

    for (int counter=0; counter<9; ++counter)
    {
         // some code here to fill b with values
         b[counter] = true;

    }
bool b[9];
bool*pb0=&b[0];
bool*pb1=&b[1];

对于(int counter=0;counter如果要使用布尔数组,请使用std::vector,它有专门的位向量实现,每个元素只使用一位。@mats:std::bitset没有那么疯狂。vector尝试成为STL容器,但失败了。还有boost::dynamic_bitset,它与std::bitset不同,可以增长。但是你最好Read不做SO。真的,但您可以通过重载一元操作符来返回它,并返回代理引用类:PThe导致的“假指针”将不能表示为char *,C++标准要求指针指向内置类型(不包括函数指针和成员指针)因此,虽然用户定义类型很有趣,但是编译器不能使用bool的技巧。这是正确的答案。更有趣的问题是,为什么标准的作者不愿意承认一个独立的“位”类型的可能性,因为它的地址无法取用,特别是它确实承认stru中此类类型的概念ctures(使用位字段),并且由于这种类型在嵌入式C世界中已经使用了很长时间。并非所有链接器都支持比一个字节更细的粒度,但标准允许编译器在方便的时候按位分配“位”变量,而无需在任何情况下都这样做。你的意思是“称为向量”。每一种其他类型的
向量
都是完全正常的。它们不是“相同大小”。与每一种其他类型一样,
bool
必须至少与
字符
大小相同。但它可以随意变大。