1 static void Main(string[] args) 2 { 3 Console.ReadKey(); 4 5 //初始化數組 不會立即開闢內存字節, 只有實際給數組賦值時 纔會開闢內存 6 // 7 //猜測數組內部的實現原理如下: 8 // 9 // > 數組內部 還有一個 數組集合 10 // > 賦值時, 會通過索引找到 對應的那個 數組集合的子數組, 然後初始化這個 子數組 11 // > 取值時, 如果索引對應的 子數組還沒有創建, 則直接返回 NULL 12 // 13 // > 經過下面代碼的 測算, 子數組的長度爲 512 左右 14 // > 比如: 你初始化一個 2048 個元素的數組, 數組內部其實開闢了 4個子數組 15 // 16 // > 下面的 array 和 array2, 17 // 前者 i=i+1 肯定會 初始化每一個 子數組 18 // 後者 i=i+512 會跳躍定位 子數組 19 // > 最後 array 和 array2 佔用內存一樣多 —— 即: 跳躍 512 依然完成了全部子數組的初始化 20 21 22 23 object[] array = new object[20 * 1024 * 1024]; //NULL 每個佔 8 字節 總內存 173M 24 for (int i = 0; i < array.Length; i = i + 1) 25 array[i] = null; 26 27 object[] array2 = new object[20 * 1024 * 1024]; 28 for (int i = 0; i < array2.Length; i = i + 512) //i=i+1 i=i+512 最後開闢的內存是一樣多的 (索引跳躍512 就會定位到 下一個子數組, 然後初始化這個 子數組) 29 array2[i] = null; 30 31 32 //int[] array3 = new int[20 * 1024 * 1024]; //Int32 每個佔 4 字節 33 //for (int i = 0; i < array3.Length; i = i + 1) 34 // array3[i] = 1; 35 36 37 38 Console.ReadKey(); 39 40 }
測試代碼 比較簡單。
32位程序,啓動時 8M,
開闢 object[] 數組,全部賦值 NULL,內存飆到 173M
object 在 數組中的指針 佔 8 字節
通過跳躍賦值, 得出結論:
數組內部 包含 若干個 子數組, 子數組 固定長度 512(左右)