2014-11-21 23 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將被清除,並且在方法完成之前您不必擔心分配的整數。