Java-源代码与字节代码中本地变量之间的双射映射

Java-源代码与字节代码中本地变量之间的双射映射,java,bytecode,local-variables,Java,Bytecode,Local Variables,Java方法源代码中的局部变量与字节码之间是否存在双射映射 例如 源代码: int x = ... A a = .... if (...) { B b = .... } 我可以假设在字节码中有3个局部变量的空间,其中第一个与x有关,第二个与a有关,第三个与b有关 字节码中本地变量的顺序是否与Java源代码中首次使用它们的顺序有关 编辑:我知道,对于longs和double,Java使用两个局部变量,并且为方法params保留了一些局部变量,因为编译器可以优化代码,因此可以消除变量。简单

Java方法源代码中的局部变量与字节码之间是否存在双射映射

例如

源代码:

int x = ...
A a = ....
if (...) {
    B b = ....
}
我可以假设在字节码中有3个局部变量的空间,其中第一个与x有关,第二个与a有关,第三个与b有关

字节码中本地变量的顺序是否与Java源代码中首次使用它们的顺序有关


编辑:我知道,对于longs和double,Java使用两个局部变量,并且为方法params保留了一些局部变量,因为编译器可以优化代码,因此可以消除变量。简单想想这样一段代码:

int a = 1; // only used to initialize b
int b = a;
这样就没有必要为
a
保留空间。或者,以你为例

int x = 42; // only used to initialize a
A a = new A(x);

不,因为编译器可以优化代码,因此可以消除变量。简单想想这样一段代码:

int a = 1; // only used to initialize b
int b = a;
这样就没有必要为
a
保留空间。或者,以你为例

int x = 42; // only used to initialize a
A a = new A(x);
Java方法源代码中的局部变量与字节码之间是否存在双射映射

通常没有,因为作用域外变量使用的地址会被其他作用域内变量重用。例如:

for (int j = 0;;) {}
int k  = 0;
k
可以重用与
j
相同的位置

Java方法源代码中的局部变量与字节码之间是否存在双射映射

通常没有,因为作用域外变量使用的地址会被其他作用域内变量重用。例如:

for (int j = 0;;) {}
int k  = 0;

k
可以重复使用与
j

-1相同的位置,这是不正确的。Javac不做这样的优化是有充分理由的——您希望在调试时显示局部变量(它还简化了编译)。记住,这不是C!JVM在运行时优化字节码,因此无需进行编译时优化。-1这是错误的。Javac不做这样的优化是有充分理由的——您希望在调试时显示局部变量(它还简化了编译)。记住,这不是C!JVM在运行时优化字节码,因此无需进行编译时优化。