第一个问题:
int [] test = new test[100];
我知道在堆中分配了100个单元的内存空间,但是在栈中存储的是堆中的地址,问栈中分配了几个单元的内存空间来存地址呢?
我自己查了下栈中好像是只保存了堆中100个单元的首地址,不大确定,求解?还有就是如果栈中只分配了一个单元存储堆中首地址的话,那我们test[10]这样查数组中的某个元素怎么定位的,是到堆中遍历数组吗?
第二个问题:
A [] test = new A[100];
A是一个类,网上是这么说的:会先在托管堆为test分配一次空间,并且这时不会自动初始化任何元素(即test[i]均为null)。等到以后有代码初始化某个元素的时候(A[0]=new A();),这个引用类型元素的存储空间才会被分配在托管堆上。
我想问的是"先在托管堆为test分配一次空间",这句话是什么意思,它分配了100个单位的内存空间吗?但后面A[0] = new A();进行实例化时,它才分配了真正存储数据的单元,但开始分配的100个单元的空间有什么用呢?
首先,如果你声明的是值类型的数组,那么CLR分配内存时在堆中一次性分配足够的内存空间,每个单元应该是所存储类型的两倍左右的容量,也就是200份int 类型的内存。该数据是已值方式存储的。
如果是引用类型的话会创建100分的地址存储引用空间,只是在没初始化数组中具体值的时候都每个单元都存储的是null引用,这个引用是4个字节长,当你对数组中某项初始化的时候,系统再次动态在堆中分配内存,并在这个数组项中存储新分配内存的引用。
原则:
1、简单的值类型的数组,每个数组成员是一个引用(指针),引用到栈上的空间(因为值类型变量的内存分配在栈上)
2、引用类型,类类型的数组,每个数组成员仍是一个引用(指针),引用到堆上的空间(因为类的实例的内存分配在堆上)
class Person{}
Person[] myPerson;
myPerson = new Person[2];
myPerson[0] = new Person;
myPerson[1] = new Person;
Persons是一个变量,它是一个可以容纳两个引用空间的内存块,
因为数组在声明定义的时候是能够知道元素个数的,所以在堆栈
上分配的内存空间是预先可以知道的
(这里的堆栈简化理解可以理解成为栈,在C++中由系统管理内存,
堆内存的管理是人工的C++中)
两个引用实际上就是两个指针变量,在32位机中,myPerson变量就是64字节(2*32)两个指针变量的内存
空间,这64字节的内存空间名字命名为myPerson