声明一次与重复声明

aku*_*ykh 1 java bytecode

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

    static int fibonacciIterative(int n) {
        int previous = 0;
        int current = 1;
        for (int i = 1; i < n; i++) {
            int temp = current;
            current += previous;
            previous = temp;
        }
        return current;
    }
Run Code Online (Sandbox Code Playgroud)
    static int fibonacciIterative(int n) {
        int previous = 0;
        int current = 1;
        int temp;
        for (int i = 1; i < n; i++) {
            temp = current;
            current += previous;
            previous = temp;
        }
        return current;
    }
Run Code Online (Sandbox Code Playgroud)

唯一的区别是变量temp声明一次又一次地在第一个版本的循环,而它的声明,一旦在第二个版本外循环。无论重要性如何,结果字节码是否有任何差异?编译器是如何处理这种情况的,第二个版本是否可以视为优化后的第一个版本?

Ant*_*ony 5

在字节码级别根本没有声明变量(忽略关于调试元数据的通常警告)。相反,每个方法都有一个包含多达 65,535 个“槽”的表,字节码可以从中存储和检索值。编译器将为每个变量分配一个槽,确保不会为活跃范围重叠的变量重用槽。

所以,在你的榜样,我希望唯一的差异是tempi不同的顺序得到分配的时隙,但字节码,否则相同。

话虽如此,这比您想象的更无关紧要,因为字节码不是 JVM 执行的(大部分时间)。相反,它只是一种抽象。对于性能真正重要的任何代码,JVM 将对您的代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的微小差异无论如何都完全没有意义。