【问题标题】:How is a bool represented in memory?布尔在内存中如何表示?
【发布时间】:2013-10-21 12:02:51
【问题描述】:

正如已经讨论过的in the docsbool 数据类型至少占用一个字节的内存。之前在 SO 上提出了类似的问题 (How a bool type variable is stored in memory? (C++)),但这个讨论和文档似乎只讨论布尔数据类型占用的空间量,而不是当我 在内存中实际发生的情况这样做:

bool b = true;

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

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

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

【问题讨论】:

  • [OT]“C++ 总部”的概念让我发笑;我觉得它是一个灰色的地方,到处都是尘土飞扬的标准副本,数百名语言律师质疑 STL 与 stdlib 和类似的诽谤。[/OT]
  • 作为这个问题的扩展,我最好使用 char(单字节)而不是 bool?

标签: c++ types boolean


【解决方案1】:

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

bool 类型的值是 truefalse。如下所述,bool 值表现为整数类型。bool 类型的值参与整数促销” ~C++03 3.9.1 §6

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

然而它定义了从boolint的整体提升:

bool 类型的右值可以转换为 int 类型的右值,false 变为 0,true 变为 1。这些转换称为积分提升。” ~ C++03 4.5 §4-5

以及从其他类型转换为bool:

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

【讨论】:

  • C++14 指定bool 一个整数类型并使用纯二进制计数系统,尽管它仍然没有确切说明这意味着什么。我们可能期望false0 具有相同的表示,而true 具有1 的表示,但实际上并没有这么说。
【解决方案2】:

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • bool复制到char(或者更好,复制到char[sizeof(bool)])会更有意义,否则这个半覆盖的int的解释可能会因其他问题(例如,在将 true 存储为单字节 1 的 32 位大端机器上,您的代码将输出 16777216)。
    • 是的,可能最好使用与 bool 大小相同的类型。
    【解决方案4】:

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

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

    在 C++ 中,您还可以定义位域 (bit fields in wikipedia),但不经常使用。

    【讨论】:

    • 小心 - bool 类型存储的内容和条件指令的 true 概念是不同的东西......
    猜你喜欢
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2019-02-10
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多