2010-07-20 51 views
1

當一個類在c#中編譯時,函數是否與它一起存儲,從而增加了所需的內存?所需的內存和數據結構佈局

換句話說,值得創建兩個類1來存儲數據,一個用數據類的實例來存儲所有函數?

因此,如果我有200個實例的數據,只有類會從200個數據+函數類的實例中不同(需要內存)?

回答

5

函數不會與類的實例一起存儲。函數的開銷與類型相關,而不是單個實例。所以實例足跡不受函數數量的影響。

這裏有一個鏈接,我發現做一個快速'必應',如果你有興趣將提供更多的細節。 http://www.codeproject.com/KB/cs/net_type_internals.aspx

2

當您實例化引用類型時,CLR將在堆上創建一個Type對象 - 堆中的所有對象都包含2個開銷成員,類型對象指針和同步塊索引。任何方法都被輸入到類型的方法表中,在該類型中定義了一個方法。因此,無論何時創建新對象,CLR都會自動初始化(該新對象的)內部類型對象指針,以指向實際的類型對象 - 其中每個引用類型只有一個對象(關於過度使用「類型」一詞)。

第一次調用某個方法時,CLR將類型對象指針指向實際的類型,並且該方法被JITed,然後CLR調用此代碼,以便隨後的方法調用CLR將調用已經JIT的代碼與類型相關 - 與對象本身相對。

因此,函數/方法本身在類型中,而不是您創建的實際對象。

如果任何人有任何意見,很高興站在這個更好的點上糾正....