我想知道 - 对象是如何存储在内存中的?
我已经知道有一个引用(就像一个指针),它是一个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会给你一个完整的答案。当然,它有点干燥。 –