【问题标题】:Memory footprint with for loop带有 for 循环的内存占用
【发布时间】:2013-04-30 09:26:43
【问题描述】:

我有以下代码:

for (int i = 0; i < array.length; i++) {
  int current = array[i];
  //do something with current...
}

和功能

int current = 0;
for (int i = 0; i < array.length; i++) {
  current = array[i];
  //do something with current...
}

我的问题是,它们是否具有相同的内存占用? 我的意思是,很明显,第二个函数将只有 1 个变量“当前”。但是第一个功能怎么样。假设数组的长度为 1000,这是否意味着将在内部循环中创建 1000 个整数变量“current”?

【问题讨论】:

标签: java


【解决方案1】:

没有区别。但是恕我直言你通常应该给variablessmallest scope你可以。所以declare它在循环内到limit its scope。您还应该在定义变量时对其进行初始化,这是不在循环外声明它的另一个原因。

【讨论】:

  • 虽然我们处于最佳实践,但它可能也应该是 final 在循环中。
【解决方案2】:

它们的足迹完全相同。他们甚至有(不考虑一些变量编号)完全相同的字节码。您可以尝试将其放入 Test.java 中,使用“javap -c Test”对其进行编译和反汇编

HTH :)

【讨论】:

    【解决方案3】:

    没有区别。编译器足够聪明,可以通过正确的优化为这两种情况生成类似的字节码

    如果你想在循环外使用变量,就在循环外声明它,否则,为了给变量最小的作用域,在循环内声明它(并考虑在这种情况下使其成为final)。

    【讨论】:

    • @downvoter。为什么你随机拒绝我的一些答案?
    • @MAROUN。请忽略那些没有正当理由的反对票,继续帮助他人。没有人成为国王,也没有人成为乞丐:) 继续前进……
    • @Baadshah 确实 :) 我来这里是为了寻求帮助,并尽可能提供帮助.. 感谢您的激励 ;)
    【解决方案4】:

    这两个代码片段是等价的。甚至可以编译成完全相同的字节码(有人会反编译它)。每个只创建一个局部变量(在循环中重复使用)。

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2016-09-08
      相关资源
      最近更新 更多