18

正如文档中已经讨论的那样,bool数据类型至少占用一个字节的内存。之前在 SO 上提出了一个类似的问题(如何将布尔类型变量存储在内存中?(C++)),但是这个讨论和文档似乎只讨论布尔数据类型占用的空间量,而不是实际发生情况我这样做时的记忆:

bool b = true;

那么内存中究竟发生了什么?未用于存储此信息的 7 位会发生什么?标准是否为此规定了行为?

它们是未定义的吗?或者 C++ 总部的某个人只是这样做:

enum bool : char 
{
  false = 0,
  true = 1
};
4

4 回答 4

19

标准规定bool值表现为整数类型,但它没有指定它们在内存中的具体表示:

“类型bool的值是trueor false。如下所述,bool值表现为整数类型。类型的值bool参与整数提升” ~ C++03 3.9.1 §6

“整数类型的同义词是整数类型。整数类型的表示应使用纯二进制计数系统定义值” ~ C++03 3.9.1 §7

然而,它定义了从boolto的整体提升int

“类型的右值bool可以转换为类型的右值int,从falsetrue变为一。这些转换称为整数提升。” ~ C++03 4.5 §4-5

以及从其他类型转换为bool

“零值、空指针值或空成员指针值转换为false;任何其他值都转换为true。” ~ C++03 4.12 §1

于 2013-10-13T23:34:53.593 回答
5

该标准没有强制要求布尔的二进制表示。它只是说,当转换为其他整数类型时,truebool 将变为 1,falsebool 将变为 0。

这当然暗示了一种在精神上与您所说的类似的实现,其中这种转换将基本上变成无操作或纯整数扩展(但请记住,它bool被强制为原始类型,而不是枚举类型)。

于 2013-10-13T23:33:04.590 回答
3

您可以通过复制内存来测试这样的事情,忽略它是哪种类型。该程序读取原始内存值test_bool并将其放入test_int,以便您可以打印它。

int test_int = 0;
bool test_bool;

test_bool = true;
memcpy (&test_int, &test_bool, sizeof(bool));
printf ("True value is: %d\n", test_int);

test_bool = false;
memcpy (&test_int, &test_bool, sizeof(bool));
printf ("False value is: %d\n", test_int);

对我来说,这个程序给出:

True value is: 1
False value is: 0
于 2013-10-13T23:46:26.643 回答
0

几个月以来我没有用 C++ 编程,但 AFAIR 规则如下: 0 - false; 任何不同于 0 的值 - 真;(默认情况下它是 1 但如果你将它从其他整数值转换为 AFAIR,例如 2 也将被视为真)。

因此,您可以说 C++ 以某种方式浪费内存(其他方式也是如此),因为它只能使用一位,但那时制作编译器更简单。

在 C++ 中,您还可以定义位域(维基百科中的位域),但并不经常使用。

于 2013-10-13T23:35:12.047 回答