一尘不染

为什么未定义Java的布尔原始大小?

java

在Java虚拟机规范说有布尔有限的支持原始类型。

没有Java虚拟机指令专门用于布尔值的操作。相反,将对布尔值进行操作的Java编程语言中的表达式编译为使用Java虚拟机int数据类型的值。

以上暗示(尽管我可能会误解了)在对布尔值进行操作时使用了int数据类型,但这是一个32位内存构造。假设布尔值仅表示1位信息:

  • 为什么不将字节(或简称)类型用作布尔值而不是int的代理?
  • 对于任何给定的JVM,最确切地找出用于存储布尔类型的内存量的最可靠方法是什么?

阅读 328

收藏
2020-03-13

共1个答案

一尘不染

简短的答案:是的,布尔值作为32位实体进行操作,但布尔数组每个元素使用1个字节。

更长的答案:JVM使用32位堆栈单元,用于保存局部变量,方法参数和表达式值。小于1个单元的基元被填充,大于32位(长和双精度)的基元占用2个单元。这种技术可以最大程度地减少操作码的数量,但是确实有一些特殊的副作用(例如需要屏蔽字节)。

数组中存储的基元可能使用少于32位,并且有不同的操作码来加载和存储数组中的基元值。布尔值和字节值都使用baloadbastore操作码,这意味着布尔数组每个元素占用1个字节。

就内存对象布局而言,这在“私有实现” 规则下已涉及到,它可以是1位,1字节,或者如另一个提示所指出的,与64位双字边界对齐。最有可能的是,它占用基础硬件的基本字长(32或64位)。

尽量减少布尔值使用的空间:对于大多数应用程序来说,这实际上不是问题。堆栈框架(包含局部变量和方法参数)不是很大,并且在大型方案中,对象中的离散布尔也不大。如果你有许多带有大量布尔值的对象,则可以使用通过getter和setter管理的位域。但是,你将付出的CPU时间损失可能比内存中的损失更大。

2020-03-13