是否为对象的函数和属性分配了单独的内存?

时间:2013-07-18 06:47:24

标签: c# object memory-management

这个问题是关于.NET的,但我认为它一般适用。实例化新对象时,该对象中的函数是否也分配了内存?即使他们直到稍后才被召唤?

换句话说,两个具有相同成员变量但具有更多方法的类在实例化时会占用更多内存吗?

4 个答案:

答案 0 :(得分:7)

Object instance 表示您分配的实例的状态。因此,它包含您在相应的类型中定义的所有字段和属性的副本。

为给定类型定义的方法保留在另一个数据结构中,从实例本身开始,称为方法表。您分配的每个实例都有一个指针,指向其类型的方法表

enter image description here

当你在方法上调用一个函数时,它会移动指针所需的地址数量,拉动函数,在堆栈中推送内存中可用的所有参数,然后调用函数。

有关详细信息,请参阅此处:Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

答案 1 :(得分:4)

  

具有相同的成员变量,但其中有一个有更多方法的实例在实例化时占用更多内存?

没有。实例所需的空间仅取决于字段。

这些方法也需要内存,但每个类只需要一次。像静态字段一样。在加载类时分配该内存。

答案 2 :(得分:3)

仅为属性而不是方法(属于实例)分配内存。为方法的元数据及其代码分配了一小部分内存。

答案 3 :(得分:1)

当您创建类的新实例时,将为该实例及其所有成员(在类中定义)分配内存。就你的问题而言,方法(函数)局部变量仅在自己调用方法时分配。

您可以查看对象创建的确切详细信息here