7

在java字节码中,为什么接收者首先被推入堆栈,然后是所有参数?我似乎记得它与效率有关。

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

方法调用

class X {

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

}

主要方法编译为:

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;
    }

}

主要方法编译为:

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

2 回答 2

1

你是在问为什么它被推?在这两种情况下,您都在访问属于类实例的东西,因此this必须是该过程的一部分。

你问为什么先推送?只是Java约定。this我想不管后面有多少事情,总是先拥有是很方便的。

于 2012-05-12T21:42:16.170 回答
1

先推有优势

  • 目标方法可以使用更密集的“aload0”字节码(比在参数列表中更晚的情况要小,并且必须使用 aload 字节码的参数版本。因为“this”经常在用于字段和方法访问的方法中引用,它导致了真正的代码密度提高。
  • 一个经常做的级联方法发送像“foo.bar().baz()”。当 bar() 返回时,如果您像在 Java 中那样安排事情,那么 .baz() 的未来“this”就神奇地已经在堆栈上的正确位置了。
于 2012-05-29T04:40:07.640 回答