cor*_*zza 6 java jvm bytecode opcode low-level
该iload
爪哇操作码用来推动从本地变量阵列(LVA)的值压入操作数栈.
此操作码将单个字节作为参数(en.wikipedia.org/wiki/Java_bytecode_instruction_listings),用作LVA的索引.
如果LVA的一个元素始终是对象的引用(我想这不是静态方法的情况,但是现在让我们忽略它们),并且如果只使用一个字节作为索引(256个可能的值),那么一个方法如何访问超过255个不同的局部变量?
tem*_*def 16
是的,Java方法可能有超过255个局部变量.该wide
操作码指令可以用来修改iload
或aload
指令,而不是使用一个8位索引16位索引,这意味着你可以在一个功能多达65536多个局部变量,只要wide
操作码最终习惯.
也就是说,请注意Java局部变量不一定与JVM局部变量一一对应.Java编译器可能会查看您的代码,注意本地的空间可以在某些上下文中重用,然后将多个Java本地映射到相同的JVM局部变量.
希望这可以帮助!
Mar*_*nik 11
我通过编写一个包含300个本地变量的程序来为您尝试.这个片段:
System.out.println(a255);
System.out.println(a256);
Run Code Online (Sandbox Code Playgroud)
编译成这个:
3575: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
3578: iload 255
3580: invokevirtual #53 // Method java/io/PrintStream.println:(I)V
3583: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
3586: iload_w #256 // Utf8 a196
3590: invokevirtual #53 // Method java/io/PrintStream.println:(I)V
Run Code Online (Sandbox Code Playgroud)
注意:使用Eclipse和javac编译,结果完全相同.
归档时间: |
|
查看次数: |
584 次 |
最近记录: |