List容器記憶體分配原則

2021-06-20 04:34:42 字數 2846 閱讀 3973



當採用預設建構函式listvalue = new list();例項化乙個list物件時,.net framework只是在記憶體中申請了一塊記憶體來存放list物件本身(不包含list當中的items元素)。

當為list物件新增第乙個item元素時,list物件會申請能儲存4個item元素的記憶體空間,然後將item元素存放在申請的空間裡。

list物件有乙個capacity屬性用來表示當前list物件的容量(即當前用於存放item的記憶體空間能存放的item的個數),可以手動的設定它來設定list的容量(capacity的改變將會導致重新申請記憶體)。

當list物件的item元素數量超過了capacity的數量時,list物件會重新申請一塊大小是原來capacity的兩倍的記憶體空間,然後將當前所有item元素以及待新增元素複製到新的記憶體空間中。

通過下列測試**可以驗證list的記憶體分配原則:

list value = new list(4

);//

此時 count:0 capacity: 4

for (int i = 1; i <= 5; i++)

//此時 count:5 capacity: 8

value.trimexcess();

//此時 count:5 capacity: 5

//remove an item

value.removeat(4

);//

此時 count:4 capacity: 5

value.trimexcess();

//此時 count:4 capacity: 5---------------capacity為什麼不是4呢?請高手指點//

remove another item

value.removeat(1

);//

此時 count:3 capacity: 5

value.trimexcess();

//此時 count:3 capacity: 3

value.clear();

//此時 count:0 capacity: 3

value.trimexcess();

//此時

count:0 capacity: 0

知道了記憶體分配的原則,接下來就得根據這些原則來採用最優的方法保證有限的記憶體空間能得到合理的運用。歸納起來主要有如下幾點:

當例項化乙個list物件時,如果能預知其item元素的大致個數,應該在例項化乙個list物件的時候設定其capacity值為接近於item元素個數的最小值。這樣的話可以避免在向list中新增元素的時候,不斷的申請記憶體與元素的複製。

當由於不斷的呼叫remove方法而導致item元素的個數遠遠小於capacity,就會造成記憶體的浪費。此時可以呼叫trimexcess方法釋放多餘的記憶體。

【附】如下為msdn中list類中的部分屬性和成員:

//

摘要://

獲取或設定該內部資料結構在不調整大小的情況下能夠容納的元素總數。

////

返回結果:

//在需要調整大小之前 system.collections.generic.list能夠容納的元素的數目。

////

異常://

system.argumentoutofrangeexception:

設定為小於 system.collections.generic.list.count

//的值。

////

system.outofmemoryexception:

//系統中沒有足夠的可用記憶體。

public

int capacity

////

摘要://

獲取 system.collections.generic.list中實際包含的元素數。

////

返回結果:

中實際包含的元素數。

public

int count

//摘要:

//將物件新增到 system.collections.generic.list的結尾處。

////

引數://

item:

//要新增到 system.collections.generic.list的末尾處的物件。對於引用型別,該值可以為 null。

public

void

add(t item);

////

摘要://

從 system.collections.generic.list中移除特定物件的第乙個匹配項。

////

引數://

item:

//要從 system.collections.generic.list中移除的物件。對於引用型別,該值可以為 null。

////

返回結果:

//如果成功移除 item,則為 true;否則為 false。如果在 system.collections.generic.list中沒有找到

//item,該方法也會返回 false。

[targetedpatchingoptout("

performance critical to inline across ngen image boundaries")]

public

bool

remove(t item);

////

摘要://

將容量設定為 system.collections.generic.list中的實際元素數目(如果該數目小於某個閾值)。

public

void trimexcess();

記憶體對齊和分配原則

題目 class o 占用多少個位元組 這個題目原理上就是記憶體分配與對齊 如果體系結構是不對齊的,a中的成員將會乙個挨乙個儲存,從而sizeof a 為11。顯然對齊更浪費了空間。那麼為什麼要使用對齊呢?體系結構的對齊和不對齊,是在時間和空間上的乙個權衡。對齊節省了時間。假設乙個體繫結構的字長為w...

max min公平分配原則

我們總會面臨這樣的問題,需要給一組使用者分配一些稀缺資源,站在資源分配者的角度,他們具有等價的權利獲取資源,但實際上,一些使用者可能獲取較少的資源就能夠滿足需要,這樣看來,他們對資源的獲取又不是完全等價的,似乎不適合去平分資源,因此就有了最大最小公平演算法。1 資源按照需求遞增的順序進行分配 2 不...

Ucos作業系統任務優先順序分配原則

ucos是乙個可剝奪性核心的作業系統。所以每乙個任務都必須有乙個優先順序。ucos作業系統中任務的優先順序使用乙個8位整型資料來表示的。比如我們的0,1,2,3這些數,ucos任務優先順序的取值範圍為 0 os lowest prio之間,數字越小,優先順序越大。靜態優先順序 這個優先順序被分配以後...