类的字段,它们是存储在堆栈还是堆中?

我昨天看到了一个问题(对我来说)另一个问题。 请查看以下代码:

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的实例时,它的字段类型也在堆上创建? 但后来我不明白什么时候它真的会在堆栈上,因为几乎总是你需要创建一个对象实例才能使用它。

据我所知,int是值类型,因此生活在堆栈中

你的理解是不正确的。 值类型称为“值类型”,因为它们是按值复制的。 引用类型称为“引用类型”,因为它们是通过引用复制的。 “值类型总是存在于堆栈中”并非完全正确。 如果这是真的,它们将被称为“堆栈类型”和“堆类型”。

事实是,这是一个实现细节。 不同的框架实现可以选择使用堆栈和堆。 以下是Microsoft实现的方式:

  • 引用类型变量的值是对堆内存的引用。 引用基本上是32位或64位整数。
  • 值类型变量的值是其值。
  • 局部变量的值存储在堆栈中,除非局部变量位于迭代器块中,或者是匿名方法或lambda表达式的封闭外部变量。 在这些情况下,局部变量的值存储在堆上。 除非当然可以优化局部变量,在这种情况下根本没有存储。 或者也许它们可以被注册,在这种情况下它们既不在堆栈也不在堆中,它们在处理器寄存器中。
  • 引用类型和静态变量的实例变量的值存储在堆上。

明白了吗?

它指向值类型,但不是这个引用(在堆上)?

字段“A”是值类型。 它是一个字段,因此该变量存储在堆上。

在创建Class1的实例时,它的字段类型也在堆上创建?

实例变量的存储位于堆上,是的。

但后来我不明白什么时候它真的会在堆栈上,因为几乎总是你需要创建一个对象实例才能使用它。

它永远不会在堆栈上。 正如我上面所说,堆栈上唯一的东西是局部变量(和编译器生成的临时变量),它们不是lambda或匿名方法的闭包本地变量而不是迭代器块。 当然,如果有空闲寄存器,抖动可以自由地将它们完全放在堆栈中并将它们放入寄存器中。

但实际上,我不得不问,为什么你关心堆栈上的内容以及堆上的内容? 堆叠上的东西是我们可以廉价地放在堆栈上的东西; 其他一切都在堆上。

本地struct(值类型)变量存储在堆栈中,类的值类型字段存储在堆上。

Ok int是一个值类型,但是’1’(类的名称太多)是一个引用类型。 这意味着任何’1’实例都在堆上。