2011-03-21 45 views
0

據說valueetype派生自system.object。爲什麼對象派生類比valuetype結構佔用更多空間? 在此先感謝爲什麼在.NET中,valutype比對象類型佔用更少的空間?

+1

'據說valuetype派生自system.object.' - 我想知道這說的是什麼,如果你發現一些消息來源聲稱,我會建議你避免它作爲學習材料。 – 2011-03-21 23:05:46

+3

@Darin - 'ValueType'派生自System.Object:http://msdn.microsoft.com/en-us/library/system.valuetype(v=VS.100).aspx。然而,它和它的派生類型是由CLR和編譯器以特殊方式處理的,所以它肯定不會像它那樣工作......但是參考資料說對象是一切的基礎,我看到了海報的混亂(裝箱是一個複雜的話題) – 2011-03-21 23:12:53

+0

@Darin你有一些聲稱相反的消息來源嗎?我認爲'ValueType'在技術上來自'Object',甚至是一個引用類型本身。但是,當然任何具體的值類型轉換爲「ValueType」或「對象」是一種拳擊轉換。 – CodesInChaos 2011-03-21 23:13:35

回答

4

每個對象都有一個對象標題。這在32位機器上是8個字節,4個是同步塊,4個是類型句柄。值類型值只有在裝箱時才從System.Object派生。整數是拆箱時的4個字節,裝箱時爲12個字節,標題爲+8個字節。

檢查this answer以獲得有關盒裝值類型的更多信息。

+0

+1,優秀的解釋。 – 2011-03-21 23:11:04

+0

值類型* always *從Object派生,並且裝箱值類型不會將其變爲對象,它只存儲在對象內。盒裝的int在32位系統上使用16個字節,在64位系統上使用20個字節。 – Guffa 2011-03-21 23:14:33

+0

@Guffa - 你可以使用鏈接的答案,看看這是不正確的。創建兩個對象。 – 2011-03-21 23:20:30

0

因爲值類型由編譯器處理不同。儘管它們從Object繼承,但它們不作爲對象存儲。

對象存儲在堆上,額外開銷兩個指針(32位系統上8個字節,64位系統上16個字節)。值類型以內聯方式存儲,可以作爲對象的一部分存儲,也可以存儲在方法調用的堆棧框架中,並且沒有額外的開銷。

0

對於從ValueType繼承的值類型以及Object中的值類型,大部分時間都有一點點白色的謊言。未裝箱的int或bool沒有與之相關的與該繼承相關的任何內容。但是,如果它是盒裝的(它會在某些操作中隱含地發生)就會獲得它。大多數語言都將它隱藏起來,所以只要我們使用它們,它們看起來就像從Object派生的任何其他對象一樣,但是當我們將它們用作它們時,它們也可以作爲簡單類型。

相關問題