【问题标题】:How a bool type variable is stored in memory? (C++)bool 类型变量如何存储在内存中? (C++)
【发布时间】:2011-11-01 14:24:26
【问题描述】:

布尔测试;

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

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

有没有什么实现技巧可以让bool数据类型只占 一点?如果可以,可以举个例子吗?

bool test1[32](在 VS 2010 中), int test2(在 VS 2010 中)

test1test2 占用相同的内存吗?

【问题讨论】:

  • 让我强调一下,当对速度进行超优化时,平台在 32 位机器上以 4 个字节存储布尔值可能是合理的。然后,如果您在一个结构中有 4 个布尔值,您只需要一个 ALU 操作来检查一个布尔值是否为真,而当一个机器字中包含许多布尔值时需要两个。 (Ofc 这么小的差异通常根本不重要。)
  • 有些嵌入式处理器实际上有位可寻址内存,所以bool变量可以占用一位。

标签: c++ boolean


【解决方案1】:

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

如果您想将多个布尔值存储在一个变量中,请使用std::bitsetstd::vector<bool>(但请注意,后者并不是真正的布尔向量,它是一种专门为节省空间而设计的)。

IIRC、C++11 也定义了std::dynamic_bitset

【讨论】:

  • 你可能是指 32 位,而不是字节
  • 如果处理器有 8 位可寻址单元,这意味着 bool 必须占用 1 个八位字节(字节),而不是 4 个(32 位)。是的,仍然有 8 位可寻址系统。 ARM9 可以访问 8 位或 32 位值。
  • @entity64: test1 是一个包含 32 个可寻址 bool 对象的数组,这将需要(至少)32 个字节,每个对象一个。
  • @entity64: 不,我的意思是 32 个字节,其中一个字节是 C++ 标准规定的最小存储单位(不一定是 8 位)。跨度>
  • 2 年后... 是的,dynamic_bitset,当然。谢谢你,!
【解决方案2】:

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

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

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

使用 sizeof 运算符可以知道它们各自占用的内容。这就是 sizeof 运算符的用途。所以test1test2将分别占据sizeof(test1)sizeof(test2)字节

【讨论】:

    【解决方案3】:

    另一种可能的 1 位变量是放入位域结构中:

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

    【讨论】:

    • 不应该是unsigned a : 1吗?
    • 好吧,我确定我是这样使用它的,虽然我从来没有将它视为一个 1 位有符号整数,所以你有一个观点。
    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2018-09-23
    • 2013-07-10
    • 1970-01-01
    相关资源
    最近更新 更多