1

我知道所有像 int 这样的原始类型都是值类型,并且是在堆栈上创建的,而字符串、对象数组等是引用类型并且是在堆上创建的。

我的疑问如下。如果我创建一个整数对象,例如 int i = new int(); 那么既然它是一个对象,它会在堆栈或堆上创建吗?

4

4 回答 4

4

简短的回答:实施细节。

长答案:实施细节 - 完全实施。

它可以在任何一个上创建.. 取决于它是如何创建的。它是一个类的成员吗?是局部变量吗?..

于 2013-06-25T09:29:17.647 回答
4

Eric Lippert 说你不应该真正关心它。在这里阅读。

Int 是一种值类型,几乎总是在堆栈中创建。

当整数是您实例化的类中的变量时,它不会在堆栈中创建:在这种情况下,实例位于堆及其所有成员中,包括值类型。

当然,我上面提供的链接比我解释得更好

于 2013-06-25T09:31:30.563 回答
3

它可以在堆栈、堆上创建或存储在寄存器中

过去我通常推翻这个神话的方式是说真正的陈述应该是“在桌面 CLR 上的 Microsoft 实现中,当值是局部变量或值时,值类型存储在堆栈中或不是 lambda 或匿名方法的封闭局部变量的临时变量,并且方法主体不是迭代器块,并且抖动选择不注册该值。”

于 2013-06-25T09:28:30.560 回答
2

int i = new int();相当于int i = 0;,所以不,它对堆栈/堆分配没有影响。

请注意,值类型并不总是在堆栈上创建,请参阅这个精美的博客条目以获取详细讨论:

于 2013-06-25T09:29:38.150 回答