【问题标题】:Why Dalvik register-based, but use stack, what is differnce?为什么 Dalvik 基于寄存器,但是使用栈,有什么区别?
【发布时间】:2021-11-17 17:12:55
【问题描述】:

许多文章都提到 Dalvik 是基于寄存器的 VM,但也有许多文章提到 Dalvik 将堆栈用于保存方法和缓存变量的线程。也许我将此与保留类、变量和方法与在处理器上执行实际操作相混淆。我认为这意味着 VM 在堆栈或寄存器中发送操作。但是找不到这个信息。请帮忙?)

【问题讨论】:

  • call stack 是记住调用方法并在返回时恢复其状态所必需的,无论此状态是如何组织的。即使所有值都保存在寄存器中,当调用的方法也想使用这些寄存器时,您也必须保存它们。 operand stack 仅保存临时结果,在调用堆栈内的 stack frame 内。

标签: android jvm dalvik


【解决方案1】:

区别在于是否使用“操作数堆栈”。使用 JVM,变量只能通过将其值推入/弹出操作数堆栈来传递。在这种情况下,当值存在于操作数堆栈中时,它们就成为操作数。要调用方法,所有参数都必须在操作数堆栈上。要将两个数字相加,两个数字都必须在操作数堆栈中,等等。

对于设计为没有操作数堆栈的 VM,将变量传递给方法需要在操作中显式编码变量/寄存器编号。这通常会产生更好的性能,但与使用操作数堆栈的设计相比,编码操作的总体大小往往会更大。

如果希望将操作编译为机器码,那么是否使用操作数堆栈并不会真正影响性能,因为涉及到如此多的转换。

【讨论】:

    猜你喜欢
    • 2011-02-12
    • 2012-01-28
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多