为什么布尔值是 1 字节而不是 1 位大小?

新手上路,请多包涵

在 C++ 中,

  • 为什么布尔值是 1 字节而不是 1 位大小?
  • 为什么没有像 4 位或 2 位整数这样的类型?

在为 CPU 编写模拟器时,我错过了上述内容

原文由 Asm 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 931
2 个回答

因为 CPU 无法处理小于字节的任何内容。

原文由 Paul Tomblin 发布,翻译遵循 CC BY-SA 2.5 许可协议

按位运算并不“慢”。

和/或操作往往很快。

问题是对齐和解决它的简单问题。

CPU 作为部分正确回答的答案通常与读取字节对齐,并且 RAM/内存的设计方式相同。

因此,必须明确订购数据压缩以使用更少的内存空间。

正如一个答案所建议的那样,您可以为结构中的每个值订购特定数量的位。但是,如果没有对齐,CPU / 内存之后会做什么?这将导致内存不对齐,如果您想在一个值中使用一半大小的位等,则不是 +1 或 +2 或 +4,而是 +1.5,因此无论如何它必须填充或恢复剩余的空间为空白,然后只需读取下一个对齐的空间,它们至少按 1 对齐,通常默认按 4(32 位)或 8(64 位)整体对齐。然后 CPU 通常会抓取包含标志的字节值或 int 值,然后检查或设置所需的值。因此,您仍然必须将内存定义为 int、short、byte 或适当的大小,但是在访问和设置值时,您可以显式压缩数据并将这些标志存储在该值中以节省空间;但是许多人不知道它是如何工作的,或者当他们有开/关值或标记当前值时跳过这一步,即使在发送/接收内存中节省空间在移动和其他受限环境中非常有用。在将 int 拆分为字节的情况下,它几乎没有价值,因为您可以单独定义字节(例如 int 4Bytes; vs byte Byte1;byte Byte2; byte Byte3; byte Byte4;)在这种情况下使用 int 是多余的;然而,在像 Java 这样更简单的虚拟环境中,它们可能将大多数类型定义为 int(数字、布尔值等),因此在这种情况下,您可以利用 int 对其进行划分并使用字节/位来实现超高效必须发送较少整数数据的应用程序(由 4 对齐)。然而,可以说管理位是多余的,它是按位运算优越但并不总是需要的众多优化之一。很多时候,人们通过将布尔值存储为整数并浪费“许多数量级”500%-1000% 左右的内存空间来利用高内存限制。它仍然很容易使用,如果您在其他优化中使用它,那么在移动和其他只有字节或几 kb 数据流入的数据流中,如果您总体上优化所有内容以加载是否会有所不同在这种情况下,它会加载或加载速度很快,因此减少发送的字节数最终会让您受益匪浅;即使您可以避免在每天的互联网连接或应用程序中发送大量不需要发送的数据。在为移动用户设计应用程序时,这绝对是您应该做的事情,甚至是当今大型企业应用程序失败的事情;使用太多空间和加载限制,可能是一半或更低。什么都不做和堆积在加载前至少需要数百 KB 或 1MB 的未知软件包/插件与为速度设计的需要 1KB 或仅几个 KB 的软件包/插件之间的区别将使其加载和动作更快,因为即使对您而言加载浪费的 MB 或数千 KB 的不需要的数据很快,您也会遇到那些有数据限制的用户和人员。

原文由 JohnC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题