gpt4 book ai didi

java - 字节码中丢失变量 'final' 修饰符?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:08 26 4
gpt4 key购买 nike

分析这个简单类的字节码后,我得出的结论是编译器不会保留有关局部变量为 final 的任何信息。不过这看起来很奇怪,因为我相信 HotSpot 编译器实际上可以使用这些信息来进行优化。

代码:

public static void main(String[] args)
{
final int i = 10;
System.out.println(i);
}

字节码:

public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=2, args_size=1
0: bipush 10
2: istore_1
3: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
6: bipush 10
8: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
11: return
LineNumberTable:
line 7: 0
line 8: 3
line 9: 11
LocalVariableTable:
Start Length Slot Name Signature
0 12 0 args [Ljava/lang/String;
3 9 1 i I

除了节省磁盘空间之外,是否有任何特定原因保留局部变量的访问标志?因为对我来说,final 似乎是变量的一个相对重要的属性。

最佳答案

final 修饰符不存在于字节码中,但编译器已经使用此信息进行一些优化。尽管您的示例没有显示,但编译器可能会在方法的字节码表示中内联 final 变量的值,从而提高性能。类似下面的内容可以显示差异:

public int addFinal() {
final int i = 10;
final int j = 10;
return i + j;
}

public int addNonFinal() {
int i = 10;
int j = 10;
return i + j;
}

生成的字节码分别针对每个方法:

// addFinal
bipush 10
istore_1
bipush 10
istore_2
bipush 20
ireturn


// addNonFinal
bipush 10
istore_1
bipush 10
istore_2
iload_1
iload_2
iadd
ireturn

关于java - 字节码中丢失变量 'final' 修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30151295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com