我在Is using var actually slow? If so, why?告诉我,值类型存储在堆栈中,类类型存储在堆中。
class MyClass
{
private int myInt;
private int[] myInts;
}
MyClass.myInt
存放在哪里? MyClass
是一个类/引用类型,所以它在堆上。 myInt
是一个值类型,它存储在某种“内部堆栈”中吗?
另外,阵列怎么样?它是一个价值还是一个阶级?
答案 0 :(得分:1)
值类型被放入堆栈,类类型被放入堆
只有一半是真的,特别是下半场。引用类型存储在堆中,始终为真。
第一部分不是真的,或者有时只是真实的。作为局部变量的值类型存储在堆栈中,但作为类或结构成员的值类型存储在该类型中。装箱的值类型存储在堆上的对象中。
因此,MyClass
的实例将包含一个整数和一个引用,并且该类的实例将始终存储在堆上。
数组是一个单独的对象,也将始终存储在堆上。如果实际上有一个数组,那就是。在您创建数组并分配给myInts
之前,它是null
并且没有数组。
答案 1 :(得分:0)
引用类型中的任何内容都将存储在堆上。该数组可能存储在''MyClass''的非相邻位置,因为它的大小无法在编译时确定。如果你对所发生的事情感到困惑,那么任何优化都不是你现在关注的问题,你可能只会让事情变得更糟,抱歉。
答案 2 :(得分:0)
在方法中声明为局部变量的值类型放在堆栈上。在类中声明值类型时,它是该类的数据的一部分,该类放在堆上。因此,对于您的类实例,myInt将在堆中。当你声明任何数组时,它是一个类,所以它在堆上获得它自己的位置,你的myInts值将是对堆上该对象的引用。
答案 3 :(得分:0)
在谈论引用和值时,它们通常意味着函数中的变量。 您的类代码退出内存的TEXT部分。当您创建一个对象(实例化它)时(对象和所有成员变量)将在Heap中。但是在传递给函数时,可以在Stack上找到对堆上的对象地址的引用。