我正在阅读有关JVM体系结构的信息。今天,我了解了操作数堆栈的概念。根据一篇文章:
在字节码指令执行期间使用操作数堆栈,其方式与在本机CPU中使用通用寄存器的方式类似。
我不明白:操作数堆栈到底是什么,以及它在jvm中如何工作?
这是各种单个字节码操作如何获取其输入以及它们如何提供其输出的方式。
例如,考虑iadd
将两个int
s相加的运算。要使用它,您将两个值压入堆栈,然后使用它:
iload_0 # Push the value from local variable 0 onto the stack
iload_1 # Push the value from local variable 1 onto the stack
iadd # Pops those off the stack, adds them, and pushes the result
现在,堆栈上的最高值是这两个局部变量的总和。下一个操作可能会使用该顶部堆栈的值并将其存储在某个位置,或者我们可能会将另一个值压入堆栈以执行其他操作。
假设您要将三个值加在一起。堆栈使操作变得简单:
iload_0 # Push the value from local variable 0 onto the stack
iload_1 # Push the value from local variable 1 onto the stack
iadd # Pops those off the stack, adds them, and pushes the result
iload_2 # Push the value from local variable 2 onto the stack
iadd # Pops those off the stack, adds them, and pushes the result
现在,堆栈上的最高值是将这三个局部变量相加的结果。
让我们更详细地看第二个例子:
我们假设:
27
10
5
所以最初:
+------+
| 堆叠
+------+
+------+
那我们做
iload_0 # Push the value from local variable 0 onto the stack
现在我们有
+------+
| 堆叠
+------+
| 27 |
+------+
下一个
iload_1 # Push the value from local variable 1 onto the stack
+------+
| 堆叠
+------+
| 10 |
| 27 |
+------+
现在我们进行添加:
iadd # Pops those off the stack, adds them, and pushes the result
它“弹出” 10
和27
离开堆栈,将它们加在一起,然后推入结果(37
)。现在我们有:
+------+
| 堆叠
+------+
| 37 |
+------+
第三次时间int
:
iload_2 # Push the value from local variable 2 onto the stack
+------+
| 堆叠
+------+
| 5 |
| 37 |
+------+
我们做第二件事iadd
:
iadd # Pops those off the stack, adds them, and pushes the result
这给了我们:
+------+
| 堆叠
+------+
| 42 |
+------+
(当然,这是
对宇宙和一切生命的终极问题的解答
。)
问题内容: JVM运行时数据区为每个正在执行的方法提供单独的堆栈。它包含操作数堆栈和局部变量。每次加载变量时,都需要先到操作数堆栈,然后再到局部变量。为什么不直接操作局部变量表,并进行一些看似重复的工作? 问题答案: 具有直接操作数的指令集必须对每个指令中的操作数进行编码。相反,对于使用操作数堆栈的指令集,操作数是隐式的。 当查看小的琐碎运算(例如将常量加载到变量中)时,隐式参数的优势并不明显。本
Linux 也是众多操作系统之一,要想知道 Linux 是什么,首先得说一说什么是操作系统。 计算机是一台机器,它按照用户的要求接收信息、存储数据、处理数据,然后再将处理结果输出(文字、图片、音频、视频等)。计算机由硬件和软件组成: 硬件是计算机赖以工作的实体,包括显示器、键盘、鼠标、硬盘、CPU、主板等; 软件会按照用户的要求协调整台计算机的工作,比如 Windows、Linux、Mac OS、
短版 Spotify Android应用程序在最近的一个版本中引入了一个“设备广播状态”开关,我想在我的应用程序中接收那些广播。有哪些广播可用,我应该如何配置我的广播接收器? 我从Spotify应用程序本身中使用了设备广播状态开关,我很高兴该开关取消/激活了这些广播事件。 我现在遇到的问题是,这些信息似乎只是零星地发送。我接收playstatechanged事件(播放、暂停、下一个、上一个),但它
考虑以下两行代码: 对我来说,他们看起来很相似。但是,第二行被Java编译器(1.8)拒绝,消息是“不能推断SimpleFileVisitor的类型参数<>”。 谁能解释一下,有什么问题吗?
本文向大家介绍什么是数组,它的作用是什么?,包括了什么是数组,它的作用是什么?的使用技巧和注意事项,需要的朋友参考一下 数组是一个数据容器,其中包含固定长度的同类数据类型的元素。它用于存储相同数据类型的元素。 示例 输出结果
本文向大家介绍JSP中 操作的功能是什么?,包括了JSP中 操作的功能是什么?的使用技巧和注意事项,需要的朋友参考一下 通过此操作,您可以将文件插入到正在生成的页面中。语法看起来像这样- 与include指令不同,include指令在将JSP页面转换为servlet时插入文件,而该动作则在请求页面时插入文件。 下表列出了与include操作相关联的属性- 序号 属性和说明 1 page 要包含的页