2012-04-22 14 views
2

我一直認爲,對列表中的默認構造函數初始化會列出爲4的容量和能力將增加第5個元素的時候,等翻番......意外的內存使用情況<T>

在我應用程序我做了大量的列表(樹狀結構,其中每個節點可以有很多孩子),其中一些節點不會有任何子節點,並且由於我的應用程序速度很快,但也使用了一些內存,我決定使用構造函數在那裏我可以指定容量,現在已將此設置爲1

奇怪的是,當我開始爲1的容量的內存使用率高出約15%,那麼當我用高清ault構造函數。這不可能是因爲更適合4,因爲加倍將是1,2,4。那麼爲什麼這會增加內存使用量呢?作爲一個額外的測試,我試圖以4的容量開始。這次內存使用率再高出15%,而不使用指定的容量。

現在,這真的不是一個問題,但它困擾我的是,我已經使用多年,一個非常簡單的數據結構有一些額外的邏輯,我不知道呢。有沒有人有這方面的列表的內部運作的想法?

回答

2

這是因爲如果使用默認構造函數,則將內部存儲陣列設置爲空數組,但如果使用具有設置大小的構造函數,則將立即設置正確大小的數組,而不是在第一個呼叫添加。

public List(int capacity) 
{ 
    if (capacity < 0) 
    { 
     ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.capacity, ExceptionResource.ArgumentOutOfRange_NeedNonNegNum); 
    } 
    this._items = new T[capacity]; 
} 

public List() 
{ 
    this._items = List<T>._emptyArray; 
} 

如果你看一下Add函數調用的ensureCapacity,如果需要的話,這將擴大內部存儲陣列:

這可以使用反編譯像JustDecompile看到。顯然,如果數組最初設置爲空數組,則第一個添加將創建默認大小數組。

+0

啊我想知道它是否會做這樣的事情。有趣的是看到空數組是由該類型的所有列表共享的。我很快實施了我自己的名單,使用了這個技巧。並確保僅增長了加1元,現在我少用8%的內存,仍然有大致相同的速度,再次感謝:d。 – 2012-04-22 08:41:54