我想知道 - 對象是如何存儲在內存中的?
我已經知道有一個引用(就像一個指針),它是一個int值,它包含存儲該對象的內存中的位置 - 但它存儲的究竟是什麼?
可以說我有ClassC
有int a, char b, long c, float d
和short e
- 我知道每個如何存儲每一個都有自己的一套位,但在每一個不同的位的數量 - 所以究竟怎樣C#知道哪些位應該訪問它,當我寫OBJ.c
或OBJ.b
?
是否有可能將整個(非靜態)對象轉換爲字節數組bit \位置和返回?
明顯 - 如果有像ClassC.TcpListener tcp
這樣的東西 - 它是一個引用並存儲爲int
(至少它具有相同的字節大小) - 但是,它仍然如何在int
和指針之間有所不同?
C#中的對象如何存儲在內存中?
回答
通常,這不是你需要關心的東西,除非你是P /調用C庫。
那麼C#如何知道當我寫入 OBJ.c或OBJ.b時應該訪問哪些位?
這取決於對象的StructLayout。有兩種可能的LayoutKind s。
缺省值爲Sequential,其中字段以與聲明相同的順序存儲,aligned正確。默認情況下,包含你的五場一個struct
將被存儲爲:
- 偏移0-3:
int a
- 偏移4-5:
char b
- 偏移6-7:填充
- 偏移8 15:
long c
- 偏移16-19:
float d
- 偏移20-21:
short e
由於vtable指針,垃圾回收器元數據等原因,A class
可能會有略微不同的佈局。我不確定它是如何工作的。
其他LayoutKind是顯式的,您可以在其中明確指定字段偏移量。
是否有可能將整個(非靜態)對象轉換爲一個字節數組\位和回?
是的,Marshal類會讓你這樣做。請參閱StructureToPtr和PtrToStructure。
它是一個參考,並存儲爲
int
指針不是存儲爲int
秒。這在64位系統上不起作用。代替使用IntPtr。
但仍然,int和指針之間有什麼區別?
在哪個級別? C#? CIL?機器語言? 「
「對象的StructLayout」似乎有些矛盾...... –
我會檢查它。謝謝! –
'Marshal'類不會讓你看看它們在內存中的字節,至少並不總是如此。它所做的是將其轉換爲適合非託管代碼的表單。翻譯通常不會做任何事情,但並非總是如此。 – svick
C#實際上不知道在哪裏訪問對象中的成員。它是決定對象佈局的JIT編譯器。
可以爲成員添加屬性,以便JIT編譯器以特定的方式放置成員,這樣可以將所有成員作爲內存塊訪問,但這很少值得付出。
注意:指針在32位系統上是32位(int),在64位系統上是64位(長)。
所以這就是爲什麼64位系統需要一堆內存>< –
- 1. 如何存儲在內存中的C++完整的對象
- 2. 如何將stl對象存儲在共享內存(C++)中?
- 3. C++如何在內存中存儲函數和對象?
- 4. 如何將對象存儲在內存中 - Java(C++)
- 5. JavaScript中的對象如何存儲在內存中?
- 6. 對象數組如何存儲在內存中?
- 7. 在C中存儲對象的引用#
- 8. 如何在C#中的列表中存儲對象的引用?
- 9. 在類中存儲內存內容 - C++
- 10. 在C++中釋放對象的內存
- 11. 在C中存儲類對象#
- 12. 在C#/ ASP.NET中存儲SqlDataReader對象?
- 13. 如何在Android室中存儲對象?
- 14. 如何在CoreData中存儲ABRecordRef對象
- 15. 如何在resque中存儲Tmail對象
- 16. 如何在indexedDB中存儲JSON對象?
- 17. 如何在SharedPreferences中存儲Date對象?
- 18. 如何將對象存儲在cookie中?
- 19. 如何在memcached中存儲protobuf對象?
- 20. 對象如何存儲在堆中?
- 21. 如何在HttpSession中存儲Java對象?
- 22. IEnumerable如何在c#中的內存中存儲?
- 23. 如何在內存中的存儲庫
- 24. 如何在PHP中的對象中存儲對象數組?
- 25. 將對象存儲在向量中,該對象位於C++中的地圖內
- 26. 如何在C代碼中存儲C++對象?
- 27. 如何在本地存儲中存儲對象數組?
- 28. C#如何從存儲在數據庫中的OLE對象中保存圖像
- 29. 在cassandra中存儲對象
- 30. 在ApplicationContext中存儲對象
」但它究竟存儲了多少?「 - 你能澄清一下你在找什麼嗎?堆vs堆棧? Endieness?還有別的嗎? – Oded
請注意,這裏的大多數答案將是一個實現細節。引用很大程度上是不透明的 - 即使它在大多數情況下碰巧是一個指針,它也不是必需的。也;在x64引用是64位,而不是32(「int」) –
此外,ECMA-335會給你一個完整的答案。當然,它有點乾燥。 –