C 中大List的記憶體分配

2022-07-04 09:48:10 字數 2233 閱讀 8248

之前在開發中只用到list的時候幾乎就是拿過來就用,從來沒有考慮過list的記憶體分配問題,試想乙個有10萬元素的list的在構造和新增元素時記憶體是如何變化的呢?在msdn上關於list的capacity屬性是這麼解釋的

,也就是說,當我們新增的元素數量小於等於capacity的值時,list是不會重新調整內部資料結構,也就是不會重新申請或者分配記憶體,而當我們新增的元素數量大於capacity 的值時,list就會不斷的調整內部資料結構或者重新申請分配記憶體,這樣的話對效率肯定會有一定的影響的。

當我們使用listlist = new list();例項化乙個list物件是,.net framework只是在記憶體中申請了一塊內存在存放list物件本身,系統此時並不知道list會有多少item元素。當我們向list新增第乙個item時,list會申請能儲存4個item元素的儲存空間,此時capacity是4,但是當我們新增到第五個item時,此時的capacity就會變成8,也就是當list發現元素的總數大於capacity數量時,會主動申請並重新分配記憶體,當我們新增到第九個item時,capacity不是12而是16,也就是說list每次申請的記憶體數量都是之前item元素數量兩倍。然後將當前所有的item元素系但新增的元素複製到新的記憶體。

大家可以看到,如果list需要新增的元素特別多時,list會不斷地申請心記憶體,複製已有元素和新加元素到新記憶體,這個過程會產生資源的浪費及效能問題。

如果當設定的capacity值遠大於list的實際元素數量時,應使用trimexcess()方法釋放點未使用的記憶體。

class

program

", parts.capacity);

parts.add(

new part() );

parts.add(

new part() );

parts.add(

new part() );

parts.add(

new part() );

parts.add(

new part() );

console.writeline();

foreach (part apart in

parts)

console.writeline(

"\ncapacity:

", parts.capacity);

console.writeline(

"count:

", parts.count);

parts.trimexcess();

console.writeline(

"\ntrimexcess()");

console.writeline(

"capacity:

", parts.capacity);

console.writeline(

"count:

", parts.count);

parts.clear();

console.writeline(

"\nclear()");

console.writeline(

"capacity:

", parts.capacity);

console.writeline(

"count:

", parts.count);

console.read();}}

public

class

part

public

int partid

public

override

string

tostring()

}

知道了list的capacity及trimexcess()方法的用處,保證有限的記憶體空間能夠得到合理的執行,歸納起來主要有以下幾點:

1.當我們例項化乙個list物件時,如果知道最大的item元素時,應該在例項化list時制定capacity的數量,直接使用list的構造方法public list(int capacity);就可以。

2.當由於不斷的從list中remove掉大量元素時,此時list記憶體仍占用一部分不需要使用的空間,造成記憶體的浪費,此時可以呼叫trimexcess方法來釋放多餘的記憶體。

以上**由「圖鬥羅」提供

C 中大List的記憶體分配

之前在開發中只用到list的時候幾乎就是拿過來就用,從來沒有考慮過list的記憶體分配問題,試想乙個有10萬元素的list的在構造和新增元素時記憶體是如何變化的呢?在msdn上關於list的capacity屬性是這麼解釋的 當我們使用listlist new list 例項化乙個list物件是,ne...

list的記憶體分配機制分析

該程式演示了list在記憶體分配時候的問題。裡面的備註資訊是我的想法。include include include include using namespace std class cdata cdata int i,string s cdata const cdata data cdata o...

List容器記憶體分配原則

當採用預設建構函式listvalue new list 例項化乙個list物件時,net framework只是在記憶體中申請了一塊記憶體來存放list物件本身 不包含list當中的items元素 當為list物件新增第乙個item元素時,list物件會申請能儲存4個item元素的記憶體空間,然後將...