據說valueetype派生自system.object。爲什麼對象派生類比valuetype結構佔用更多空間? 在此先感謝爲什麼在.NET中,valutype比對象類型佔用更少的空間?
回答
每個對象都有一個對象標題。這在32位機器上是8個字節,4個是同步塊,4個是類型句柄。值類型值只有在裝箱時才從System.Object派生。整數是拆箱時的4個字節,裝箱時爲12個字節,標題爲+8個字節。
檢查this answer以獲得有關盒裝值類型的更多信息。
+1,優秀的解釋。 – 2011-03-21 23:11:04
值類型* always *從Object派生,並且裝箱值類型不會將其變爲對象,它只存儲在對象內。盒裝的int在32位系統上使用16個字節,在64位系統上使用20個字節。 – Guffa 2011-03-21 23:14:33
@Guffa - 你可以使用鏈接的答案,看看這是不正確的。創建兩個對象。 – 2011-03-21 23:20:30
因爲值類型由編譯器處理不同。儘管它們從Object
繼承,但它們不作爲對象存儲。
對象存儲在堆上,額外開銷兩個指針(32位系統上8個字節,64位系統上16個字節)。值類型以內聯方式存儲,可以作爲對象的一部分存儲,也可以存儲在方法調用的堆棧框架中,並且沒有額外的開銷。
對於從ValueType繼承的值類型以及Object中的值類型,大部分時間都有一點點白色的謊言。未裝箱的int或bool沒有與之相關的與該繼承相關的任何內容。但是,如果它是盒裝的(它會在某些操作中隱含地發生)就會獲得它。大多數語言都將它隱藏起來,所以只要我們使用它們,它們看起來就像從Object派生的任何其他對象一樣,但是當我們將它們用作它們時,它們也可以作爲簡單類型。
- 1. 爲什麼在.NET中確定對象類型?
- 2. 爲什麼宏需要比等價定義的函數佔用更多空間?
- 3. 在64位系統中,32位變量比64位對象佔用更少的空間?
- 4. 爲什麼沒有成員變量的C++類佔用空間?
- 5. 爲什麼SQL select在java中佔用更多的CPU時間?
- 6. 爲什麼空的IndexedDB仍佔用空間?
- 7. 自定義包裝類比Java包裝類佔用更多/更少的空間嗎?
- 8. 爲什麼HTML元素佔用的空間比應該多得多?
- 9. CardLayout - 使其佔用最少的空間
- 10. 爲什麼繼承對象類型
- 11. 有沒有辦法以編程方式知道對象在內存中佔用了多少空間? (.Net 2.0)
- 12. 爲什麼在Android中沒有Java.util.concurrent.TimeUnit類型比SECONDS更大?
- 13. 使用.Net中的另一個相同類型的對象更新對象的最佳方法是什麼?
- 14. 在64位系統中,32位列佔用的空間比64位少?
- 15. 爲什麼「使用命名空間系統」導致缺少類型說明符?
- 16. 爲什麼 - (空)在我的對象
- 17. 爲什麼Grunt/Gulp插件佔用這麼多空間?
- 18. 爲什麼Derby數據庫佔用這麼多空間?
- 19. 爲什麼我們使用引用子類對象的超類型對象
- 20. 爲什麼我在python中接收對象類型int的TypeError?
- 21. 以下佔用多少存儲空間?
- 22. 爲什麼QT的iOS組件佔用大量磁盤空間?
- 23. 爲什麼不可見的LinearLayout佔用空間?
- 24. 爲什麼我的div不會佔用所有剩餘空間?
- 25. 爲什麼在對象空間中執行選擇測試通常更容易?
- 26. 什麼模型對象類型用於在Django Admin中存儲時間值?
- 27. 爲什麼Contains比對象比==更不同?
- 28. 爲什麼System.Windows命名空間中的WPF類型?
- 29. 可爲空的對象類型
- 30. MySQL:爲什麼DELETE比INSERT更佔用CPU資源?
'據說valuetype派生自system.object.' - 我想知道這說的是什麼,如果你發現一些消息來源聲稱,我會建議你避免它作爲學習材料。 – 2011-03-21 23:05:46
@Darin - 'ValueType'派生自System.Object:http://msdn.microsoft.com/en-us/library/system.valuetype(v=VS.100).aspx。然而,它和它的派生類型是由CLR和編譯器以特殊方式處理的,所以它肯定不會像它那樣工作......但是參考資料說對象是一切的基礎,我看到了海報的混亂(裝箱是一個複雜的話題) – 2011-03-21 23:12:53
@Darin你有一些聲稱相反的消息來源嗎?我認爲'ValueType'在技術上來自'Object',甚至是一個引用類型本身。但是,當然任何具體的值類型轉換爲「ValueType」或「對象」是一種拳擊轉換。 – CodesInChaos 2011-03-21 23:13:35