昨天我看到了一个问题(对我来说)另一个问题。请查看以下代码:
public class Class1
{
int A; //as I uderstand, int is value type and therefore lives in the stack
}
class Class2
{
Run()
{
Class1 instance1 = new Class1();
instance1.A = 10; //it points to value type, but isnt this reference (on heap)?
}
}
或者在创建Class1实例时,它的字段类型也在堆上创建?但后来我不明白什么时候它真的会在堆栈上,因为几乎总是你需要创建一个对象实例才能使用它。
答案 0 :(得分:42)
据我所知,int是值类型,因此存在于堆栈中
您的理解不正确。值类型称为“值类型”,因为它们是按值复制的。引用类型称为“引用类型”,因为它们是通过引用复制的。 “价值类型总是存在于堆栈中”并非完全正确。如果这是真的,它们将被称为“堆栈类型”和“堆类型”。
事实是,这是一个实施细节。不同的框架实现可以选择使用堆栈和堆。以下是Microsoft实现的方式:
这是清楚的吗?
它指向值类型,但不是这个引用(在堆上)?
字段“A”是值类型。它是一个字段,因此该变量存储在堆上。
在创建Class1实例时,它的字段类型也在堆上创建?
实例变量的存储位于堆上,是的。
但是后来我不明白什么时候它真的会在堆栈上,因为几乎总是需要创建一个对象实例才能使用它。
永远不会在堆栈上。正如我上面所说的那样,堆栈上唯一的东西是局部变量(和编译器生成的临时变量),它们不是lambda或匿名方法的本地变量,也不在迭代器块中。当然,如果有空闲寄存器,抖动可以自由地将它们完全放在堆栈中并将它们放入寄存器中。
但实际上,我不得不问,为什么你关心堆栈上的内容以及堆上的内容?堆叠上的东西是我们可以廉价地放在堆栈上的东西;其他一切都在堆上。
答案 1 :(得分:8)
本地struct(值类型)变量存储在堆栈中,类的值类型字段存储在堆上。
答案 2 :(得分:2)
Ok int是一个值类型,但是'1'(一个可怕的类名)是一个引用类型。这意味着任何'1'实例都在堆上。