为什么c ++中的char和bool大小相同?

时间:2008-11-05 21:54:31

标签: c++ boolean

我正在阅读 C ++编程语言。在其中Stroustrup声明sizeof(char) == 11 <= sizeof(bool)。具体取决于实施。为什么布尔值这样的简单值与char相同?

7 个答案:

答案 0 :(得分:66)

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

答案 1 :(得分:20)

因为在C ++中你可以获取布尔值的地址,并且大多数机器不能处理单个位。

答案 2 :(得分:12)

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

答案 3 :(得分:5)

从理论上讲,你只需要一个bool的位,但使用少于1个字节的数据是很麻烦的。你需要更多的指示来实现任何目标,而你并没有真正受益。

如果您想将多个布尔值打包成一个字节,可以使用bit-field structure

答案 4 :(得分:2)

实际上,在大多数实现中我都知道sizeof(bool)== sizeof(int)。 “int”旨在成为CPU最有效的数据大小。因此,没有特定大小的东西(如“char”)与int的大小相同。如果每个对象都有大量的对象,您可能希望实现一种将它们打包存储的方法,但在正常计算过程中,它应保留原始大小。

答案 5 :(得分:2)

在C ++中有一个名为vector的东西,试图利用理论上可以在一个字符中存储8个bool的事实,但它被C ++标准委员会普遍认为是一个错误。书“有效的stl”实际上说“不要使用它”。这应该会让你知道它是多么棘手。

BTW:Knuth只有book专门用于按位操作。 Boost还有library专用于以更高效的内存方式处理大量位。

答案 6 :(得分:2)

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

请考虑以下代码:

    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存储为1位,则pb0将等于pb1,因为两者具有相同的地址。这显然是不可取的!

此外,循环中的赋值将导致非trival汇编代码。它将在循环的每次迭代中涉及不同的位移。在高性能软件中,那些额外的位移操作会不必要地降低应用程序的速度。

STL库在空间DO很重要的情况下提供解决方法。使用std :: vector&lt; bool&gt;将bool存储为1位。上述示例的悖论不适用,因为

  • operator []的重载隐藏了位移操作的严格性
  • 使用迭代器而不是指针为实现提供了额外的灵活性