类中的值类型存储在哪里?

6
如果我有一个类的字段,它们存储在堆栈还是堆中?

可能重复的问题:
类的字段,它们存储在栈或堆中吗?

如果我有

Class A
{
    int k=0;
}

我正在做:

A x  = new A();

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


2
你没收到备忘录吗?栈是一种实现细节 - user395760
3个回答

6

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


这是一个实现细节,您不应该依赖它。 - Darin Dimitrov
1
@Darin:是的,但事实仍然是这是对实际问题提出的当前答案。Eric是正确的——底层实现并不是最重要的细节——但程序员应该理解他们使用的任何功能的可能底层实现以及其可能的影响,如果他们想编写良好的代码。我并不是建议我们依靠实现细节来获得微小的性能提升,而是如果我们盲目地假设编译器/CLR会神奇地使任何代码快速,我们将编写大量垃圾代码。 - Jason Williams

4

4

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

它不会存储在堆栈上,因为将其放在那里没有任何意义。由于该值是引用类型的一部分,在当前过程退出后它仍然存在。但如果它在堆栈上,那么在弹出堆栈帧之后,它将被删除。这将使对象无效,除非有某些真正巨大的额外工作正在进行,以尝试在堆栈中来回移动它以保持其存活状态。

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

然而,最正确的答案是存储数据的位置是实现细节,所以您应该假设您不知道(并且不能知道)。引用类型和值类型真正的区别是建立在它们的名称中的:对于值类型,诸如赋值和传递参数等操作会导致对象的值被复制。对于引用类型,这些操作会创建对原始对象的附加引用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接