2015-03-08 57 views
0

假設有一個環,其中有需要被重置爲0每次迭代名爲counter的整數變量的情況。這兩個版本中的哪一個會更有效率?效率的在最簡單的循環

版-1:

for (int i = 0; i < 10; i++) { 
    int counter = 0; 
    if (something()) counter++; 
} 

版-2:

int counter; 
for (int i = 0; i < 10; i++) { 
    counter = 0; 
    if (something()) counter++; 
} 

在第一版本中,計數器變量的範圍內的for循環,它的在重新配置的每次迭代的內存。在第二種情況下,它只是覆蓋整個程序中的單個內存位置。我認爲第二個版本效率更高,但是效率可以忽略不計或相當大,還是相反?

+1

編譯/ JIT可能會變成#2#1反正 – arynaq 2015-03-08 22:10:35

+0

對於哪種語言?在什麼操作系統上?什麼平臺和版本?總之,答案*可以忽略不計*,並提防過早優化。 – 2015-03-08 22:10:37

+4

我希望你不會找到任何差別 - 現代編譯器會找出你是如何在這兩種情況下使用'counter'併產生相同的代碼。 – 2015-03-08 22:11:08

回答

1

在第一個版本中,每次迭代都會在內存中重新分配計數器而不是。它是一個原始類型(int)的變量,所以大多數編譯器會將它存儲在堆棧中。沒有理由要使用的循環不同迭代不同的堆棧單元,所以它會被存儲在同一個位置,就像在第二個版本。

(這是假設,因爲你不使用它的價值的任何地方編譯器不會對的Elid變量counter完全。)

+0

爲什麼downvote ? – yole 2015-03-08 22:17:55

+0

Upvoted取消我們的lacraig2的downvote,這個答案是正確的。沒有「重新分配」。 – Blindy 2015-03-08 22:19:41

+0

@Bindind http://meta.stackexchange.com/questions/74666/is-voting-to-balance-in-the-spirit-of-the-site – 2015-03-08 22:21:03