2017-09-11 20 views
-1

我有以下幾行代碼:分配內存以可變在c#

SomeClass a; 
SomeClass b = new SomeClass(); 
SomeClass c = new SomeClass() 
{ 
    Foo="sss", 
    Bar="dddd" 
}; 

請告訴我類實例abc的大小(在存儲器中)?

有多少內存分配給每個變量?

+1

實際變量都是相同的大小,因爲它們是引用。並且堆中的實際對象也將具有相同的大小(請注意,這些字符串將是單獨的對象,該對象具有引用2)。當然,'a'沒有實際引用,因爲它是'null'。 https://stackoverflow.com/questions/3800882/how-big-is-an-object-reference-in-net – juharr

+0

什麼是在堆上,什麼是堆棧實際上是一個框架的實現細節。由於是串聯實習。並且JiT編譯可能會丟失一個,因爲它永遠不會被使用,並且它是無效代碼。所以:可能的最大和最小量之間的任何值,取決於運行時間。更大的問題是:你爲什麼問?你有什麼樣的微觀優化或錯誤的道路? – Christopher

回答

0

當你實例化b和c時,內存被自動分配,你不必自己處理它。你可以忘記那個部分,這是被管理的魔法部分,一旦這些對象不再需要(無指針...),垃圾收集器將爲你釋放內存空間。儘管如此,b和c採用相同的內存大小,因爲它是相同的類型。 a沒有空間,因爲它尚未初始化。

+0

'a'確實在堆棧中爲實際變量佔用空間,它只是沒有引用堆中的任何內容。 – juharr

+0

c#編譯器和JIT通常會刪除未使用的變量,將它們刪除,從而不分配內存? – KitAndKat

+0

這只是一個代碼片段,所以可能會有一個'if'後者來設置'a',在這種情況下它不能被優化,但是它可能會編譯,就好像'a'甚至不存在。 – juharr