我逐渐相信,布尔变量的最佳大小是数据的自然宽度,即在C/C++中是int。因此,对于现代处理器,这通常是32位。例如,在机器级别,要将其声明为字节,需要32位获取,然后是掩码。
然而,我已经看到iOS中的BOOL是8位的。我曾假设使用字节的人使用的是来自8位处理器的遗留思想。
我意识到这个问题取决于使用,在大多数情况下,语言定义的boolean是最好的选择,但有时您需要定义自己的语言,例如当您转换来自外部源的代码时,或者您想要编写跨平台代码时。
同样重要的是,如果要将布尔值打包成串行流,以便通过诸如以太网的串行线发送或存储,则将布尔值打包成更少的比特可能是最优的。但我觉得,打包和拆开处理器的最佳大小可能是最好的。
所以我的问题是,我认为32位处理器上布尔值的最佳大小是32位,如果是这样,为什么iOS使用8位。
发布于 2012-07-19 22:34:49
涉及32位获取和硬件掩码的8位数量的概念基本上已经过时了。实际上,从内存中获取(在现代处理器上)通常是一条L2缓存线(通常在64-128字节左右)。在这种情况下,基本上您处理的每个大小的项目都涉及到获取大量数据,然后仅使用获取的数据的某个子集(但是,假设您的数据或多或少是连续的,可能会在随后使用更多的数据)。
C++尝试(不一定成功)为您优化这一点。一个单独的bool可以是一个字节以上的任何地方,尽管在大多数典型的实现中,它要么是一个字节,要么是四个字节。(备受诟病的) std::vector<bool>使用了一些技巧来提供(某种)向量界面,但仍然将每个bool存储在一个位中。在这个过程中,它失去了被视为泛型序列容器的能力--但是当您存储了大量的bool,并且可以忍受以类似数组的方式使用它的限制时,它实际上可能比许多人认为的要有用得多。
当/如果你想保留普通的容器语义,并且不介意额外的存储空间来保持它们的原生大小,你可以使用另一个容器(例如,std::deque<bool>)。特别是如果您只需要存储一小部分bool,这通常是一个更好的选择。
发布于 2012-07-19 21:28:37
是的,你是对的,这要看情况而定。使用8位的最大优势是可以很好地将更多内容放入结构中。
当然,在这种情况下最好使用标志。
然而,最大的问题是,对于C/C++ "bool“,您不一定知道它有多大。这意味着您无法对结构进行假设(例如二进制写入磁盘),而不可能在另一个平台上破坏它。在这种情况下,使用已知大小的变量可能非常有用,如果要将结构转储到磁盘,最好使用尽可能少的空间。
发布于 2012-07-19 21:41:34
它依赖于体系结构,但在许多32位体系结构中,8位寻址的效率不低于32位;这样的“获取和掩码”是在硬件逻辑中执行的。
存储空间方面的最佳大小当然是1比特。例如,您可以使用位字段或位掩码将多个布尔值打包到一个字中。诸如8051之类的一些体系结构具有位可寻址存储器。更现代的ARM Cortex-M架构采用了一种称为的技术,它允许内存和硬件寄存器是位可寻址的
https://stackoverflow.com/questions/11561806
复制相似问题