我目前正在調查在Windows下的malloc()
實現。但在我的研究中,我偶然發現了讓我感到困惑的事情:Windows內存分配問題
首先,我知道在API級別,windows主要使用調用HeapAlloc()
和VirtualAlloc()
來分配內存。我從here收集微軟實施malloc()
(包括在CRT - C運行時)基本上呼籲HeapAlloc()
> 480字節的塊,否則管理一個特殊的區域分配VirtualAlloc()
小分配,以防止碎片。
那麼這一切都很好。但是接下來還有malloc()
的其他實現,例如nedmalloc,聲稱比微軟的malloc
快125%。
這一切都讓我不知道的幾件事情:
爲什麼我們不能只調用
HeapAlloc()
爲小塊?在分散性方面表現不佳(例如,通過「先做」而不是「最適合」)?- 其實,有沒有什麼辦法可以知道各種API分配調用的內幕?這會很有幫助。
是什麼讓比微軟的
malloc
更快nedmalloc
這麼多?從上面的,我得到的印象是
HeapAlloc()
/VirtualAlloc()
是如此緩慢,它是malloc()
快得多在一段時間只有一次打電話給他們,然後來管理分配的內存本身。這個假設是真的嗎?或者是malloc()
「包裝」只是因爲碎片需要? 有人會認爲這樣的系統調用會很快 - 或者至少有一些想法會被加入到它們中,以提高效率。- 如果這是真的,爲什麼這樣呢?
平均來說,有多少內存(一個數量級)讀/寫是由一個典型的
malloc
調用(可能已經分配的段數的函數)來執行?我會直覺地說,這是一個普通節目的十幾歲,對嗎?
另外,閱讀關於「dlmalloc」的內容對於malloc策略來說是非常豐富的。 – Will 2010-07-07 22:53:35