this 和堆栈上的参数的 Java 字节码顺序

标签 java parameters jvm stack bytecode

在 java 字节码中,为什么首先将接收者压入堆栈,然后是所有参数?我记得好像和效率有关。

对于方法调用和设置字段都是如此。

方法调用

class X {

    int p(int a) {
        //Do something
    }
    int main() {
        int ret = p(1);
    }

}

Main 方法编译为:

aload_0 // Load this onto the stack
iconst_1 // Load constant 1 onto the stack
invokevirtual <int p(int)> from class X

设置字段:

class X {
    int x;
    int main() {
        x = 1;
    }

}

Main 方法编译为:

aload_0 // Load this onto the stack
iconst_1 // Load constant 1 onto the stack
putfield <int x> from class X

最佳答案

先推有优势

  • 目标方法可以使用更密集的“aload0”字节码(小于 如果它在参数列表的后面很多并且不得不使用 aload 字节码的参数版本。因为“this”经常在方法中被引用以访问字段和方法,所以它会带来真正的代码密度改进。
  • 人们经常使用级联方法发送,例如“foo.bar().baz()”。当 bar() 返回时, .baz() 的 future “this”神奇地已经在正确的位置 如果您像在 Java 中那样安排事情,请堆栈。

关于this 和堆栈上的参数的 Java 字节码顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10565921/

相关文章:

java - java中删除查询的验证

java - 在 Java 和 Rest Assured 中使用嵌套标签测试 post 方法时遇到问题

java - 在方法参数中设置数组项

java - 对同一个对象有多个引用是不是很糟糕?

Java 堆栈溢出错误 - 如何在 Eclipse 中增加堆栈大小?

java - 如果我从我的同步方法调用非同步方法是非同步方法线程安全的吗?

c++ - C++ 函数中对默认第一个参数的支持历史

encryption - Qpdf 没有密码无法加密

java - -Djava.library.path 中的多个目录

java - Alljoyn 示例应用程序资源