当前位置: 首页 > 面试题库 >

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

皇甫礼骞
2023-03-14
问题内容

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

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

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

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

问题答案:

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

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

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

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

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



 类似资料:
  • 在对XML文件应用转换时,我得到了这个错误(即,未定义有效的布尔值)。这里有一个奇怪的陷阱: *我的应用程序从一个文件位置读取500到800个XML文件(XML文件大小范围从几KB到10MB),然后对每个文件进行转换。最初一切都很顺利,但在一些执行之后,它会在错误下面抛出: productsfromloc_v3.xsl: forg0006第651行错误:在xsl:call-template nam

  • 问题内容: 我正在关注egghead.io上的视频教程,但是在尝试遵循他在创建工厂时的示例时,我一直收到“未定义角度”的参考错误,但是我包含了角度脚本 这是我的html页面: 这是我的JavaScript文件“ main.js”: 我已经读过几篇类似的文章,如果我写错了,请纠正我,但是我认为这与引导绑定有关,并且我尝试使用手动引导,但没有成功,仍然遇到相同的错误。 但是我想知道的是,为什么这可以在

  • 如果我有: 很明显,这个表达式后面的应该是零,但我看到的任何地方,他们都说这个代码的行为是未定义的,而不仅仅是的值(直到减法之前)。 很明显,编译器可以简单地在变量中使用它认为“方便”的任何垃圾值,并且它将按照预期工作。这种方法有什么问题?

  • 问题内容: 我正在使用Vue.js创建一个组件。 当我引用中的任何所述的生命周期钩(,,等等)它的计算结果为: 我的计算属性内部也发生了同样的事情: 我收到以下错误: 未捕获的TypeError:无法读取未定义的属性“ bar” 为什么要在这些情况下进行评估? 问题答案: 这两个示例都使用arrow函数,该函数绑定到与Vue实例不同的上下文。 根据文档: 不要在实例属性或回调(例如)上使用箭头功能

  • 我在chrome控制台中写了这样的表达式: 它返回:

  • 我找不到这个职位的申请书http://127.0.0.1:3001/users?name=Slava. 服务器响应“需要名称”。方法getUsers正常工作。数据库工作正常,服务器。js也能工作。我在这里寻找类似的答案,但没有合适的答案。有一些非常古老的答案,但它们并不相关。 这是一项请求:http://127.0.0.1:3001/users?name=bob (我用邮递员送信)