2012-12-14 48 views
3

我想知道在每對夫婦的循環代碼,一些版本是否消耗比第二個內存少,如果這是真的,在一些版本中,我們爲每個變量分配的新空間內的變量循環週期。定義循環VS外

注:2是很明顯的,1和3是比較有趣..

While(!exit) 
{ 
    int x = 5; 
} 

對戰:

int x= 0; 
While(!exit) 
{ 
    x = 5; 
} 

引用類型相同的問題: 。

While(!exit) 
{ 
     Point p = new Point(); 
     p.x = 5; 
} 

對戰:

Point p = new Point(); 
While(!exit) 
{ 
     p.x = 5; 
} 

。沒有類似分配到1?:

While(!exit) 
{ 
     Point p = point1; 
} 

對比基準類型:

Point p = null; 
While(!exit) 
{ 
    p = point1; 
} 
+0

我會假設編譯器會爲你優化它。 – Khan

+8

對於所有實際目的而言,這並不重要。將範圍界定作爲變量聲明決策的基礎,而不是性能。 –

+0

*順便說一句:* Point是'struct',所以值的類型。 –

回答

4

編譯器決定有多少棧的存儲位置的功能需求,並會竭盡所能,以減少需要。喜歡的東西:

{ 
    int a; 
    ... 
} 
{ 
    int b; 
    ... 
} 

似乎需要兩個存儲位置,但是編譯器可以看到,第一個是從未使用過的第一個範圍之內,可以重複使用的位置對於b。

它也可以看到,它可以不設棧存放一起,在寄存器中進行所有這些事情。

無論循環與否,單個變量聲明定義了單個的存儲位置。永遠不會有這樣的情況,即爲循環的每次迭代創建一個新的存儲位置。

一般情況下,這是不是你需要去關注的東西。

請注意,「調試」版本可能會在堆棧中爲每個聲明的變量生成單獨的存儲位置,以便在調試時更輕鬆地查看這些變量。

0

沒關係。編譯器優化它,所以它保持不變。它不應該影響C#等編譯語言的性能。例如,在Java中,最好只聲明一次。

0

正確的方法是分解它,然後查看代碼。你會看到每個引用。

鏈接到MSDN的方式來做到這一點:http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx

的代碼是CIL相當可讀。只需搜索函數名稱,就可以看到對新函數的調用等。

+0

C#上的Optimiaztions傾向於在抖動級別進行,而不是IL級別。最重要的是,這實際上並沒有回答這個問題。 – Servy