java - 声明一次与重复声明
问题描述
想象一下这些版本中的一个函数:
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;
}
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;
}
唯一的区别是变量在第一个版本的循环中一次又一次temp
地声明,而在第二个版本的循环外声明一次。无论重要性如何,生成的字节码有什么区别吗?编译器是如何处理这种情况的,第二个版本是否可以被视为优化的第一个版本?
解决方案
根本没有在字节码级别声明变量(忽略有关调试元数据的常见警告)。相反,每个方法都有一个最多包含 65,535 个“槽”的表,字节码可以从中存储和检索值。编译器将为每个变量分配一个槽,确保不要将槽用于具有重叠活性范围的变量。
因此,在您的示例中,我希望唯一的区别是temp
并i
以不同的顺序分配插槽,但字节码在其他方面是相同的。
话虽如此,这甚至比您想象的更无关紧要,因为字节码不是 JVM 执行的(大多数情况下)。相反,它只是一个抽象。对于性能实际上很重要的任何代码,JVM 将对您的代码进行静态分析,然后对其进行优化并将其编译为本机代码,因此字节码编码中的微小差异无论如何都是完全没有意义的。
推荐阅读
- python - 转换为 df 列到日期时间 - 提高 SettingWithCopyWarning
- html - 为什么将鼠标悬停在主 div 上会显示下拉菜单但按钮不显示?
- cassandra - Cassandra (Datastax) CQL 忽略 TEXT 列的大小写
- ios - 从平台方法调用返回布尔值
- kotlin - What is the use of "this.toString()" in get()?
- python - 你能帮我用变量解决 Python Sqlite3 的问题吗?
- java - Spring Security 绕过传入请求
- c# - 下载速度低 Google.Apis.Drive.v3 C#
- logstash-logback-encoder - 如何配置 LoggingEventCompositeJsonEncoder 的自定义 PatternLayout?
- javascript - 上下文更改时重新加载组件?(反应)