【问题标题】:Where is value type inside a class is stored? [duplicate]类中的值类型存储在哪里? [复制]
【发布时间】:2011-10-12 22:23:29
【问题描述】:

可能重复:
Fields of class, are they stored in the stack or heap?

如果我有

Class A
{
    int k=0;
}

我正在做:

A x  = new A();

k 存储在哪里?在堆上还是栈上?为什么?

【问题讨论】:

标签: c# .net


【解决方案1】:

它(可能 - 见下文)与类的所有其他数据一起存储在堆上。

它没有存储在堆栈中,因为将它放在那里没有任何意义。由于该值是引用类型的一部分,因此即使在当前过程退出后它也会继续存在。但是,如果它在堆栈上,那么它会在堆栈帧弹出后被删除。这将使对象无效,除非有一些真正具有纪念意义的额外工作正在尝试将其在堆栈中上下移动以使其保持活力。

此外,堆栈是一个很小的空间,并且粘贴在代码中创建的每个值类型的每个实例会导致它非常非常快地耗尽空间。

但是,最正确的答案是存储数据的位置是一个实现细节,因此您应该假设您不(也不可能)知道。引用类型和值类型之间的真正区别在于它们的名称中内置的 on:对于值类型,赋值和作为参数传递等操作会导致对象的值被复制。对于引用类型,此类操作会创建对原始对象的附加引用。

【讨论】:

    【解决方案2】:

    尽管 k 是一个 int 值类型,但它包含在引用类型中,因此它将作为分配给 x 的内存的一部分存储在堆上 -虽然这是一个实现细节,但这是 .NET 的当前行为。

    【讨论】:

    • 这是一个你不应该依赖的实现细节。
    • @Darin:是的,但事实仍然是这是对所提出的实际问题的当前答案。 Eric 是对的 - 底层实现并不是最重要的细节 - 但程序员应该了解他们使用的任何功能的可能底层实现以及它可能的含义,如果他们想写得好代码。我并不是说我们应该依靠实现细节来获得微不足道的性能提升,但是如果我们只是盲目地假设编译器/CLR 会神奇地使任何代码变快,我们就会写很多废话。
    【解决方案3】:

    没有明确的答案。 CLR 没有定义是把对象放在栈上还是堆上。

    欲了解更多信息,请阅读 Eric Lippert 的 blog posts

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多