2014-11-21 21 views
3

正如标题所暗示的,什么是使用这个的好处:对于多个for循环使用单个整数有什么优点?

int i; 

for (i = 0; i < 4; i++){ 
    <do stuff> 
} 

for (i = 0; i < 7; i++){ 
    <do other stuff> 
} 

,而不是这样的:

for (int i = 0; i < 4; i++){ 
    <do stuff> 
} 

for (int i = 0; i < 7; i++){ 
    <do other stuff> 
} 

换句话说,有没有不声明另一个变量对每个回路中的任何优势?

我会想象它需要更少的内存来存储它们,但它们都将在方法结束时被废弃,那么为什么它很重要? (或者GC只会摆脱它们)

+1

赞成限制范围,你应该总是去版本2. – SBI 2014-11-21 15:19:22

+3

,除非你需要循环外的'我',没有价值的第一种方法在第二个 – kolossus 2014-11-21 15:20:01

回答

5

这两种解决方案几乎肯定会占用完全相同的内存量,并且此处不涉及堆内存(GC无关紧要)。

即使在javac的级别,也可以很容易地确定第二种情况下的局部变量超出范围(在for循环之外),并且可以为其他循环重用该位置。

在运行时,变量可能会被分配给一个寄存器,并且受实际代码和JVM实现的许多细节影响,循环将以其他方式展开或转换,使得几乎不可能理解该变量的“内存使用情况”的概念。

+0

非常感谢你解释,我有一种感觉它会重用与第一个变量相同的地方。 – bernhardkiv 2014-11-21 15:21:01

0

没有与之相关的优势或劣势...它是基于需求的变量 如果您需要的是无处不在的阶级,那么它必须在方法或循环外..但如果它被声明的变量仅用于循环的使用,那么不需要首先声明它,两者对内存的影响几乎相同。

4

要知道,懒惰的程序员有时候使用循环变量来确定循环正确完成,如:

int i; 
for (i = 0; i < 7; i++){ 
    if (someRandomCondition) 
     break; 
} 

if (i < 7) 
... Oops, we exited early 

这显然是不良的做法 - 最好是在其他地方保留这种提前退出状态,因此,如果你正在整理范围,可能需要重构。

0

我认为你有正确的想法。唯一的区别是变量变成垃圾时。

在第一个示例中,当父方法完成时,整数wil变成垃圾。在第二个例子中,当每个for循环结束时,整数将变成垃圾。

如果您使用的语言具有自动垃圾收集(Java),则使用for循环声明int可能最终会节省内存。后来在同一个父方法中,int将被清除,并且在方法完成之前您不必担心分配的整数。