【发布时间】:2011-10-12 22:23:29
【问题描述】:
如果我有
Class A
{
int k=0;
}
我正在做:
A x = new A();
k 存储在哪里?在堆上还是栈上?为什么?
【问题讨论】:
-
你没有收到备忘录吗? The stack is an implementation detail!
如果我有
Class A
{
int k=0;
}
我正在做:
A x = new A();
k 存储在哪里?在堆上还是栈上?为什么?
【问题讨论】:
它(可能 - 见下文)与类的所有其他数据一起存储在堆上。
它没有存储在堆栈中,因为将它放在那里没有任何意义。由于该值是引用类型的一部分,因此即使在当前过程退出后它也会继续存在。但是,如果它在堆栈上,那么它会在堆栈帧弹出后被删除。这将使对象无效,除非有一些真正具有纪念意义的额外工作正在尝试将其在堆栈中上下移动以使其保持活力。
此外,堆栈是一个很小的空间,并且粘贴在代码中创建的每个值类型的每个实例会导致它非常非常快地耗尽空间。
但是,最正确的答案是存储数据的位置是一个实现细节,因此您应该假设您不(也不可能)知道。引用类型和值类型之间的真正区别在于它们的名称中内置的 on:对于值类型,赋值和作为参数传递等操作会导致对象的值被复制。对于引用类型,此类操作会创建对原始对象的附加引用。
【讨论】:
尽管 k 是一个 int 值类型,但它包含在引用类型中,因此它将作为分配给 x 的内存的一部分存储在堆上 -虽然这是一个实现细节,但这是 .NET 的当前行为。
【讨论】: