我想知道 - 对象如何存储在内存中?
我已经知道有一个引用(比如指针)是一个int值,它包含存储该对象的内存中的位置 - 但它是如何存储的?
假设我ClassC
有int a, char b, long c, float d
和short e
- 我知道每个存储的每个都有自己的位集,但每个不同的位数 - 所以C#究竟是怎么做的知道我写OBJ.c
或OBJ.b
时应该访问哪些位?
是否有可能将整个(非静态)对象转换为字节数组\ bit AND back?
显而易见 - 如果有类似ClassC.TcpListener tcp
的东西 - 它是一个引用并存储为int
(?Atleast它具有相同的字节大小) - 但是,它仍然如何在int
之间有所不同和一个指针?
答案 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
将存储为:
int a
char b
long c
float d
short e
由于vtable指针,垃圾收集器元数据等,class
的布局可能略有不同。我不确定它是如何工作的。
另一个LayoutKind是Explicit,您可以在其中明确指定字段偏移。
是否有可能将整个(非静态)对象转换为字节数组\ bit AND back?
是的,Marshal课程可以让你这样做。请参阅StructureToPtr和PtrToStructure。
它是一个引用并存储为
int
指针不会存储为int
。这不适用于64位系统。而是使用IntPtr。
但是,如何在int和指针之间有所区别?
在哪个级别? C#? CIL?机器语言?