c语言中有布尔型常量吗,关于布尔值:布尔类型变量如何存储在内存中? (C ++)...

本文讨论了C++中bool类型的内存占用,在VS2010环境下,一个bool变量占1字节。虽然标准规定bool至少占用1个字节,但在某些优化场景下,如嵌入式系统,可能希望bool占用更少空间。提到了使用std::bitset或std::vector来存储多个bool值以节省空间,并提及位域结构作为另一种可能性。同时指出,即使在32位系统中,由于内存寻址限制,bool变量仍至少占用1个字节。
摘要由CSDN通过智能技术生成

布尔测试

如果使用VS 2010,则为sizeof(test) = 1。由于每种C ++数据类型都必须可寻址,

" test"布尔变量为8位(1字节)。

我的问题是," test"变量是否真的占用了内存中的1个字节?

有什么实现技巧可以使bool数据类型仅占据

一点? 如果可以,可以举个例子吗?

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

int test2(在VS 2010中)

test1和test2是否占用相同的内存?

让我强调一下,当对速度进行超优化时,平台在4位字节的32位计算机上存储布尔值可能是合理的。 然后,如果您在一个结构中有4个布尔值,则只需要执行一次ALU操作即可检查布尔值是否为真,而在一个机器字中有许多布尔值时,则只需两个ALU操作。 (Ofc这样小的差异通常根本不重要。)

某些嵌入式处理器实际上具有位可寻址内存,因此bool变量可以占用一位。

test1的每个元素都必须是可寻址的。 这意味着test1至少占用32个字节(而不是位)。

如果要将多个布尔值存储在单个变量中,请使用std::bitset或std::vector(但请注意,后者并不是真正的布尔向量,这是一种旨在节省空间的专业化方法)。

IIRC,C ++ 11也定义了std::dynamic_bitset。

你的意思可能是32位而不是字节

如果处理器具有8位可寻址单元,则意味着bool必须占用1个八位字节(字节),而不是4个(32位)。 是的,那里仍然有8位可寻址系统。 ARM9可以访问8或32位值。

@ entity64:test1是32个可寻址的bool对象的数组,这些对象将(至少)需要32个字节,每个对象一个。

h! -没看到。 对不起:-)

@ entity64:不,我的意思是32个字节,其中一个字节是C ++标准规定的最小存储单位(不一定是8位)。

2年后...是的,没错,dynamic_bitset。 感谢您,!

My question is that does the"test" variable really occupy 1 byte in memory?

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

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

Does test1 and test2 occupy the same memory?

通过使用sizeof运算符,可以知道它们各自占据什么。 那就是sizeof运算符的用途。 因此test1和test2将分别占据sizeof(test1)和sizeof(test2)字节。

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

struct {

int a:1;

int b:1;

};

应该不是unsigned a : 1吗?

好吧,我确定我以这种方式使用了它,尽管我从未将其视为1位带符号整数,所以您在这里有个要点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值