布尔变量的最佳大小是多少?

时间:2012-07-19 13:22:22

标签: c++ ios boolean

我开始相信布尔变量的最佳大小是数据的自然宽度,即在C / C ++中它是int。因此对于现代处理器,这通常是32位。在机器级将其声明为一个字节,例如需要32位读取,然后是掩码。

但是我看到iOS中的BOOL是8位。我曾假设使用字节的人正在使用来自8位处理器的遗留问题。

我意识到这个问题取决于使用,并且在大多数情况下,语言定义的布尔值是最好的选择,但有时您需要定义自己的,例如当您转换来自外部源的代码时或者你想编写跨平台代码。

同样重要的是,如果要将布尔值打包到串行流中,通过串行线路(例如以太网)发送或存储它可能是最佳的,以较少的比特打包布尔值。但我觉得从最佳尺寸的处理器打包和解包是很可能的。

所以我的问题是,我认为32位处理器上布尔值的最佳大小是32位是正确的,如果是这样,为什么iOS使用8位。

3 个答案:

答案 0 :(得分:2)

是的,你是对的,这取决于你。使用8位的一大优点是可以很好地将更多内容打包到结构中。

当然,在这种情况下你最好使用旗帜。

然而,最大的问题是,使用C / C ++“bool”,你不一定知道它有多大。这意味着您不能对结构(例如二进制写入磁盘)做出假设,而不会在另一个平台上破坏它。在这种情况下,使用已知大小的变量可能非常有用,如果要将结构转储到磁盘,也可以使用尽可能少的空间。

答案 1 :(得分:1)

它依赖于体系结构,但在许多32位体系结构中,8位寻址的效率不低于32位;这样的“获取和屏蔽”是在硬件逻辑中执行的。

就存储空间而言,最佳尺寸当然是1位。例如,您可以使用位字段或位掩码在一个单词中打包多个布尔值。某些架构(如8051)具有位可寻址内存。更现代的ARM Cortex-M架构采用了一种名为 bit-banding 的技术,允许存储器和硬件寄存器进行位寻址

答案 2 :(得分:1)

涉及32位提取后跟硬件屏蔽的8位数量的概念主要是已过时。实际上,从存储器(在现代处理器上)获取通常是一个L2高速缓存行(通常大约64-128字节)。在这种情况下,基本上您处理的每个大小的项目涉及获取大量数据,然后仅使用您获取的内容的某些子集(但是,假设您的数据或多或少是连续的,可能随后使用更多的数据。)

C ++ 尝试(不一定成功)为您优化这一点。单个bool可以是从一个字节开始的任何地方,但在大多数典型实现中,它可以是一个字节或四个字节。 (受到很多谴责)std::vector<bool>使用一些技巧来提供类似矢量的接口,但仍将每个bool存储在一个位中。在这个过程中,它失去了被视为通用序列容器的能力 - 但是当你存储大量的bool,并且可以忍受以类似数组的方式使用它的限制时,它实际上可能很多比许多人认为的更有用。

当/如果要保留正常的容器语义并且不介意额外的存储空间以保持它们的原始大小时,可以使用另一个容器(例如std::deque<bool>)。特别是如果你只需要存储一小部分bool s,这通常是一个更好的选择。