对象如何在C#中存储在内存中?

时间:2011-07-24 18:38:51

标签: c# oop memory


我想知道 - 对象如何存储在内存中? 我已经知道有一个引用(比如指针)是一个int值,它包含存储该对象的内存中的位置 - 但它是如何存储的? 假设我ClassCint a, char b, long c, float dshort e - 我知道每个存储的每个都有自己的位集,但每个不同的位数 - 所以C#究竟是怎么做的知道我写OBJ.cOBJ.b时应该访问哪些位? 是否有可能将整个(非静态)对象转换为字节数组\ bit AND back?

显而易见 - 如果有类似ClassC.TcpListener tcp的东西 - 它是一个引用并存储为int(?Atleast它具有相同的字节大小) - 但是,它仍然如何在int之间有所不同和一个指针?

2 个答案:

答案 0 :(得分:2)

C#实际上不知道在哪里访问对象中的成员。它是决定对象布局的JIT编译器。

可以为成员添加属性,以便JIT编译器以特定的方式放置成员,这样就可以将所有成员作为内存块进行访问,但这很少值得付出努力。

注意:32位系统上的指针是32位(int),64位系统上是64位(长)。

答案 1 :(得分:1)

一般情况下,除非你是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指针,垃圾收集器元数据等,class的布局可能略有不同。我不确定它是如何工作的。

另一个LayoutKind是Explicit,您可以在其中明确指定字段偏移。

  

是否有可能将整个(非静态)对象转换为字节数组\ bit AND back?

是的,Marshal课程可以让你这样做。请参阅StructureToPtrPtrToStructure

  

它是一个引用并存储为int

指针不会存储为int。这不适用于64位系统。而是使用IntPtr

  

但是,如何在int和指针之间有所区别?

在哪个级别? C#? CIL?机器语言?