第一個問題:
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