Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 声明一次与重复声明_Java_Bytecode - Fatal编程技术网

Java 声明一次与重复声明

Java 声明一次与重复声明,java,bytecode,Java,Bytecode,想象一下这些版本中的函数: 静态int fibonaccierativeint n{ int-previous=0; int电流=1; 对于int i=1;i

想象一下这些版本中的函数:

静态int fibonaccierativeint n{ int-previous=0; int电流=1; 对于int i=1;i唯一的区别是变量temp在第一个版本的循环中一次又一次地声明,而在第二个版本的循环外声明一次。不管重要性如何,结果字节码是否存在任何差异?编译器是如何处理这种情况的?第二个版本可以被视为优化的第一个版本吗?

在字节码级别根本不声明变量,忽略了有关调试元数据的常见警告。相反,每个方法都有一个最多65535个插槽的表,字节码可以从中存储和检索值。编译器将为每个变量分配一个插槽,确保不会对具有重叠活动范围的变量重用插槽

所以在你的例子中,我希望唯一的区别是temp和我以不同的顺序分配插槽,但是字节码在其他方面是相同的


也就是说,这比你想象的更不相关,因为字节码不是JVM大部分时间执行的东西。相反,它只是一种抽象。对于任何性能真正重要的代码,JVM都会对代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的细微差异无论如何都是毫无意义的。

在字节码级别根本不声明变量,忽略了关于调试元数据的常见警告。相反,每个方法都有一个最多65535个插槽的表,字节码可以从中存储和检索值。编译器将为每个变量分配一个插槽,确保不会对具有重叠活动范围的变量重用插槽

所以在你的例子中,我希望唯一的区别是temp和我以不同的顺序分配插槽,但是字节码在其他方面是相同的

也就是说,这比你想象的更不相关,因为字节码不是JVM大部分时间执行的东西。相反,它只是一种抽象。对于任何性能真正重要的代码,JVM都会对代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的细微差异无论如何都是毫无意义的。

变量temp在循环中一次又一次地声明它不是。java编译器将改变这一点。您可以通过反编译编译编译的类并将反编译器生成的源代码与原始源代码进行比较来进行验证。变量temp在循环中一次又一次声明它不是。java编译器将改变这一点。您可以通过反编译已编译的类并将反编译器生成的源代码与原始源代码进行比较来进行验证。