【问题标题】:Does an instance of class containing no objects create a heap entry不包含对象的类的实例是否创建堆条目
【发布时间】:2014-08-08 10:30:41
【问题描述】:

如果一个类的新实例不包含任何对象,它是创建一个堆条目(其中没有任何内容)还是只是一个没有指向堆上某个位置的引用/指针的堆栈条目?空类的新实例是否使用任何堆内存?例如:

class MyClass
{
}
class Program
{
     Static void Main(string [] args)
     {
            MyClass mc = new MyClass();
     }
}

【问题讨论】:

  • 没有字段并不意味着没有数据。特别是在 .Net 中。会有关于类的元信息,它是什么类型,大小,引用计数等。我猜它仍然会将数据放在堆上。
  • 是的,听起来不错。类是引用类型,因此需要堆来存储。任何内存需求都必须在堆上分配,即使它很小。令人沮丧的是,我无法找到这些信息。有人确定吗?

标签: c# heap-memory stack-memory


【解决方案1】:

是的,这会在堆上创建一个对象。堆栈上会有一个对它的引用(除非它因为没有使用引用而被优化掉)。

即使类的非静态字段为零,对象实例也会包含一些标头/元数据。

还有简单的表达式语句

{
    new object();
}

在堆上创建一个对象,即使你不使用它的引用。

【讨论】:

  • 嗯,这很有趣。
【解决方案2】:

无法在堆栈上分配对象,因为对象的生命周期可能会持续到实例化它的函数的末尾。对象实例将在堆上创建。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2013-05-17
    相关资源
    最近更新 更多