我正在讀'CLR通過C#',並且'在運行時如何聯繫'以及'原始,參考和值類型'我有點困惑。 如果我有下面的代碼從主叫 -原始類型不變性和堆棧?
void DoSomething(int x)
{
int m = x/2;
int n = SomeMethod1(m);
n = (n * 2) + x;
int k = SomeMethod2(n);
m += (k*3);
}
的代碼沒有任何用處,但我只是想了解當地的整數變量和內存分配的行爲。
我知道m,n和k位於堆棧上嗎? 現在,對於最後一行(我忽略變量n),必須修改'm'的值。因此,堆棧中的所有其他內容必須被彈出並且'm'的值被更新?相比堆上的裝箱和拆箱開銷,這可以忽略不計嗎?如果堆疊高度更高,它會變得重要嗎?
P.S:從討論中排除GC(對於裝箱和取消裝箱),這絕對是一種開銷,也只是試圖理解行爲,可能/可能不是實際情況。
看起來你不明白堆棧變量尋址是如何工作的。它不是'pop' /'push',它只是從堆棧指針偏移,這是1-2 cpu指令(糾正我,如果我錯了)。所以與拳擊/拆箱相比,沒有任何開銷。 – Sinatr 2014-09-11 09:23:54
@Sinatr:它檢查/比較堆棧中的每個變量,直到它變爲'm'並更新值? – Kodathon 2014-09-11 09:36:16
不是,'m'被引用爲'ptr + 123'(舉例),其中'ptr'是堆棧指針(寄存器?),而'123'是一個偏移量。因此,任何使用'm'的操作都不取決於它在堆棧中的深度。另外,也許你認爲,什麼'ptr'是*當前堆棧指針*,在'n'和'k'之後改變?這是不對的,'ptr'對一個進程(線程?)是恆定的,它是*堆棧的開始*(或者輸入函數時的堆棧點,直到函數退出時它們保持不變)。搜索'stack'解釋,也許[this](http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/stack.html)可以。 – Sinatr 2014-09-11 10:40:58