为什么Java的布尔基元大小没有定义?

Java虚拟机规范指出对布尔基类型的支持有限。

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

以上意味着(尽管我可能误解了它)在布尔操作时使用int数据类型,但这是一个32位内存构造。 假设一个布尔值只代表1位信息:

  • 为什么一个字节或短的类型不用作布尔代替int的代理?
  • 对于任何给定的JVM,确切地找出用于存储布尔类型的内存的最可靠方法是什么?

  • 简短回答:是的,布尔值被操纵为32位实体,但布尔值数组每个元素使用1个字节。

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

    存储在数组中的元素可能使用少于32位,并且有不同的操作码可以从数组中加载和存储原始值。 布尔值和字节值都使用baload和bastore操作码,这意味着布尔数组每个元素需要1个字节。

    就内存中的对象布局而言,这在“专用实现”规则下涵盖,它可以是1位,1字节或另一张海报,与64位双字边界对齐。 最有可能的是,它需要底层硬件的基本字大小(32或64位)。


    至于尽量减少布尔值使用的空间量:对于大多数应用程序来说,它确实不是问题。 堆栈帧(包含本地变量和方法参数)不是很大,而在大型方案中,对象中的离散布尔值也不是那么大。 如果你有很多的布尔对象,那么你可以使用通过你的getters和setter管理的位域。 但是,您将在CPU时间内支付罚款,这可能大于内存中的罚款。


    继承层次结构中的某个布尔值最多可以使用8个字节! 这是由于填充。 更多细节可以在我的Java对象使用多少内存中找到?

    回到布尔值消耗多少的问题上,是的,它至少消耗了一个字节,但由于对齐规则,它可能消耗更多。 恕我直言,它是更有趣的知道,布尔[]将消耗每个条目一个字节,而不是一个位,加上一些开销,由于对齐和数组的大小字段。 有一些图形算法需要大量的比特字段,而且你需要知道,如果你使用布尔[],你需要的内存几乎是真正需要的8倍(1字节比1比特)。


    在Nutshell中的第五版Java(O'Reilly)说布尔基元类型是1个字节。 这可能是错误的,根据堆的检查结果显示。 我想知道大多数JVM是否为变量分配少于一个字节的问题。

    链接地址: http://www.djcxy.com/p/86611.html

    上一篇: Why is Java's boolean primitive size not defined?

    下一篇: What is "(something else)" in jol GraphLayout output?