为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

当年话下 2019-08-26 15:39:55
为什么没有定义Java的布尔基元大小?在Java虚拟机规范说有布尔有限的支持原始类型。没有专门针对布尔值操作的Java虚拟机指令。相反,Java编程语言中对布尔值进行操作的表达式被编译为使用Java虚拟机int数据类型的值。以上暗示(虽然我可能误解了它)在操作布尔值时使用int数据类型,但这是一个32位内存构造。假设布尔值仅代表1位信息:为什么不使用byte或short类型作为布尔值而不是int的代理?对于任何给定的JVM,什么是最可靠的方法来找出用于存储布尔类型的确切内存量?
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

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

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

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

就内存中的对象布局而言,这包含在“私有实现” 规则中,它可以是1位,1个字节,或者作为另一个海报,与64位双字边界对齐。最有可能的是,它需要基础硬件的基本字大小(32或64位)。


至于最大限度地减少布尔使用的空间量:对于大多数应用来说,它确实不是问题。堆栈帧(保存局部变量和方法参数)不是很大,并且在大方案中,对象中的离散布尔值也不是那么大。如果你有很多带有大量布尔值的对象,那么你可以使用通过你的getter和setter管理的位字段。但是,您将在CPU时间内支付一个可能大于内存惩罚的惩罚。


查看完整回答
反对 回复 2019-08-26
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2019-08-26
?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-08-26
  • 3 回答
  • 0 关注
  • 430 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信