從簡單測試看D陣列記憶體分配策略

2021-08-29 06:07:46 字數 792 閱讀 7378

d語言動態陣列可以在執行期改變大小,這和c++的vector相似。似乎記得「stl原始碼分析」一書中提到vector的記憶體分配策略是倍增方式的,d語言陣列是不是也使用了相同方式呢?我做了個簡單的測試:

[code]

void main()

arr ~= 0;

}writefln("***************==");

while (arr.length)

arr.length = arr.length - 1;}}

[/code]

上面的**先是在陣列中加入元素,如果陣列位址發生變化,則表明內在已經重新分配了。然後是刪除元素,改變陣列的長度就可以做到。

執行結果如下:

[code]14

81632***************==

[/code]

基本可以確定它是使用了倍增的分配策略,而刪除元素時並不重新分配空間(這也是預期的)。

我們知道這種分配策略是會拷貝陣列元素的,如果要減少這種拷貝,就需要在建立陣列時分配足夠的空間。如何分配乙個可以容納1024個元素的空間,但它的長度卻為0?

由於d的文件經常悄悄地新增一些東西,所以我重新看了一下d語言文件陣列部分,以防有新的做法是我沒有看到的,不過並沒有找到這種直接的做法(如果你的到了請告訴我,謝謝)。

根據上面的測試**,最合理的一種做法大概是:

[code]

int arr = new int[1024];

arr.length = 0;

[/code]

然後進行陣列元素的新增操作,不會引起內在的重新分配。

物件陣列 簡單記憶體分配

1 第一行 在棧記憶體中宣告了乙個物件陣列的引用 名字 然後在堆記憶體中分配了6個student型別的空間,同時將每乙個空間初始化,初始化值為null,最後將位址賦給student陣列,最後student陣列指向對應的記憶體空間。2 第二行 1 首先在堆記憶體中分配了乙個空間,然後呼叫它的建構函式。...

sds 簡單動態字串 記憶體預分配優化策略

在目前版本的 redis 中,sds max prealloc 的值為 1024 1024 也就是說,當大小小於 1mb的字串執行追加操作時,sdsmakeroomfor 就為它們分配多於所需大小一倍的空間 當字串的大小大於 1mb,那麼 sdsmakeroomfor 就為它們額外多分配 1mb的空...

乙個測試ACE各種記憶體分配策略效率的程式

在256m記憶體的redhat9虛擬機器上執行申請釋放10000000,每次大小為1k,結果如下 testmalloc loop 10000 use time 32.950000 s testcached loop 10000 use time 1.730000 s testmallocmmap l...