是存储在堆栈或堆上的类内的 int

本文关键字:int 存储 堆栈 | 更新日期: 2023-09-27 17:56:18

可能的重复项:
堆栈和堆理解问题

有人告诉我使用 var 真的很慢吗?如果是这样,为什么?值类型存储在堆栈中,类类型存储在堆中。

class MyClass
{
  private int myInt;
  private int[] myInts;
}

MyClass.myInt存储在哪里? MyClass是类/引用类型,因此它在堆上。 myInt是一种值类型,那么它是否存储在某种"内部堆栈"上?

另外,数组呢?它是一个值还是一个类?

是存储在堆栈或堆上的类内的 int

值类型放入堆栈,类类型放入堆

其中只有一半是正确的,特别是后半部分。引用类型存储在堆中,这始终是正确的。

第一部分不是真的,或者只是有时是真的。作为局部变量的值类型存储在堆栈中,但作为类或结构成员的值类型存储在该类型中。装箱的值类型存储在堆上的对象中。

因此,MyClass的实例将包含一个整数和一个引用,并且该类的实例将始终存储在堆上。

数组是一个单独的对象,也将始终存储在堆中。如果实际上有一个数组,那就是。在你创建一个数组并分配给myInts之前,它是null的,没有数组。

引用类型中的任何内容都将存储在堆中。数组可能会存储在与"MyClass"不相邻的地方,因为它的大小无法在编译时确定。如果你对什么去哪里感到困惑,任何优化都不是你现在关心的问题,你可能只会让它变得更糟,对不起。

在方法中声明为局部变量的值类型放置在堆栈上。在类中声明值类型时,它是该类数据的一部分,放在堆上。因此,对于您的类实例,myInt 将在堆中。当你声明任何数组时,它是一个类,所以它在堆上有自己的位置,你的myInts值将是堆上对该对象的引用。

在谈论引用和值时,它们通常是指函数中的变量。您的类代码在内存的 TEXT 部分退出。当您创建对象(实例化它)时,它(对象和所有成员变量)将在堆中。但是,在传递给函数时,可以在 Stack 上找到对堆中对象地址的引用。