.NET对象可执行指令内存消耗?

.NET对象可执行指令内存消耗?,.net,clr,memory-management,.net,Clr,Memory Management,对象的可执行代码是为所有实例存储一次,还是为每个实例存储一次 换句话说,对象的代码是存储一次并重新使用,还是每个实例都有自己的副本?代码与静态数据一样共享 只有类中特定于实例的部分是分开的。代码是共享的,静态数据也是共享的 只有类中特定于实例的部分是分开的 每当在堆中创建对象时,每个对象都会获得两个与之相关的额外开销字段。第一个开销字段MethodTablePointer包含类型的方法表的内存地址。基本上,这个指针可以获取堆中任何对象的类型信息。事实上,当您在内部调用System.Object的

对象的可执行代码是为所有实例存储一次,还是为每个实例存储一次


换句话说,对象的代码是存储一次并重新使用,还是每个实例都有自己的副本?

代码与静态数据一样共享


只有类中特定于实例的部分是分开的。

代码是共享的,静态数据也是共享的


只有类中特定于实例的部分是分开的

每当在堆中创建对象时,每个对象都会获得两个与之相关的额外开销字段。第一个开销字段MethodTablePointer包含类型的方法表的内存地址。基本上,这个指针可以获取堆中任何对象的类型信息。事实上,当您在内部调用System.Object的GetType方法时,此方法会跟随对象的MethodTablePointer字段来确定对象的类型。”


因此,您的实例不复制任何共享类型的数据/代码。相反,它有一个指向它的指针。

这里有一个更详细的信息,取自

每当在堆中创建对象时,每个对象都会获得两个与之相关的额外开销字段。第一个开销字段MethodTablePointer包含类型的方法表的内存地址。基本上,这个指针可以获取堆中任何对象的类型信息。事实上,当您在内部调用System.Object的GetType方法时,此方法会跟随对象的MethodTablePointer字段来确定对象的类型。”


因此,您的实例不复制任何共享类型的数据/代码。相反,它有一个指向它的指针。

我想知道,在这个词中有没有面向对象的框架/语言,而在这个词中不是这样的?:)我想知道,在这个词中有没有面向对象的框架/语言