Java方法可以有超过255个局部变量吗?

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操作码指令可以用来修改iloadaload指令,而不是使用一个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编译,结果完全相同.