2017-01-16 53 views
4

動態類型是否使用比相關類型更多的內存大小?c#中動態類型的內存使用情況

例如,該字段只使用四個字節?

dynamic foo = (int) 1488; 
+0

底層變量仍然是一個'int',所以是的值是4個字節。儘管如此,程序使用動態會有一些額外的一般開銷。 –

+0

「動態」僅僅是一個「對象」,它使用一堆幻想的Reflection來使它像一個動態類型。它不會佔用比它實際表示的類型更多或更少的數據。 – Abion47

+0

你的答案在這裏。 (請注意第一個例子,動態類型和對象類型都返回System.Int32類型。)https://msdn.microsoft.com/en-us/library/dd264741.aspx – Sparrow

回答

7

簡短的回答

號實際上,它將使用32位機器上的12個字節,在64位的24個字節。

長的答案

一個dynamic類型將被存儲爲一個對象,但在運行時,編譯器會加載更多的字節,以什麼與dynamic類型做感。爲了做到這一點,將會用更多的內存來解決這個問題。將dynamic想象爲看中對象。

這裏是一個類:

class Mine 
{ 
} 

這裏是在32位用於上述目的的開銷:

-------------------------- -4 bytes 
| Object Header Word | 
|------------------------| +0 bytes 
| Method Table Pointer | 
|------------------------| +4 bytes for Method Table Pointer 

總共12個字節,需要由於最小的引用類型被分配給它的在32位上是12個字節。

如果一個字段添加到類像這樣:

class Mine 
{ 
    public int Field = 1488; 
} 

它仍然需要12個字節,因爲開銷和int場可以容納12個字節。

如果我們添加另一個int字段,則需要16個字節。

但是,如果我們一個dynamic字段添加到類像這樣:

class Mine 
{ 
    public dynamic Field = (int)1488; 
} 

它將是12個字節。動態字段將被視爲object,因此大小將爲12 + 12 = 24字節。

有意思的是,如果你這樣做,而不是:

class Mine 
{ 
    public dynamic Field = (bool)false; 
} 

Mine一個實例仍然需要24個字節,因爲即使動態字段僅僅是一個布爾值,它仍然像對待一個object

在64位機器上,由於64位上的最小參考類型爲24個字節(24 + 24 = 48個字節),因此動態的Mine實例需要48個字節。

Here一些陷阱你應該知道的,看看this答案的object大小。