如果我有一个类的字段,它们存储在堆栈还是堆中?
可能重复的问题:
类的字段,它们存储在栈或堆中吗?
如果我有
Class A
{
int k=0;
}
我正在做:
A x = new A();
k
存储在堆还是栈上?为什么?
可能重复的问题:
类的字段,它们存储在栈或堆中吗?
如果我有
Class A
{
int k=0;
}
我正在做:
A x = new A();
k
存储在堆还是栈上?为什么?
尽管k
是一个值类型的int,但它被包含在引用类型中,因此它将作为内存的一部分存储在堆上,这是.NET当前行为的实现细节。
这个值(可能 - 见下文)与类的所有其他数据一起存储在堆上。
它不会存储在堆栈上,因为将其放在那里没有任何意义。由于该值是引用类型的一部分,在当前过程退出后它仍然存在。但如果它在堆栈上,那么在弹出堆栈帧之后,它将被删除。这将使对象无效,除非有某些真正巨大的额外工作正在进行,以尝试在堆栈中来回移动它以保持其存活状态。
此外,堆栈是一个小空间,将代码中创建的每个值类型的每个实例粘贴在一起会导致它非常快地耗尽空间。
然而,最正确的答案是存储数据的位置是实现细节,所以您应该假设您不知道(并且不能知道)。引用类型和值类型真正的区别是建立在它们的名称中的:对于值类型,诸如赋值和传递参数等操作会导致对象的值被复制。对于引用类型,这些操作会创建对原始对象的附加引用。