之前在開發中只用到list的時候幾乎就是拿過來就用,從來沒有考慮過list的記憶體分配問題,試想乙個有10萬元素的list的在構造和新增元素時記憶體是如何變化的呢?在msdn上關於list的capacity屬性是這麼解釋的
當我們使用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知道了list的capacity及trimexcess()方法的用處,保證有限的記憶體空間能夠得到合理的執行,歸納起來主要有以下幾點:", 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()
}
1.當我們例項化乙個list物件時,如果知道最大的item元素時,應該在例項化list時制定capacity的數量,直接使用list的構造方法public list(int capacity);就可以。
2.當由於不斷的從list中remove掉大量元素時,此時list記憶體仍占用一部分不需要使用的空間,造成記憶體的浪費,此時可以呼叫trimexcess方法來釋放多餘的記憶體。
C 中大List的記憶體分配
之前在開發中只用到list的時候幾乎就是拿過來就用,從來沒有考慮過list的記憶體分配問題,試想乙個有10萬元素的list的在構造和新增元素時記憶體是如何變化的呢?在msdn上關於list的capacity屬性是這麼解釋的 也就是說,當我們新增的元素數量小於等於capacity的值時,list是不會...
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元素的記憶體空間,然後將...