2012-09-06 44 views
0

在我的程序中我創建了一個大型的(〜1000萬個元素)對象列表,其中每個對象大約有500個字節。目前的分配是這樣的:大分配 - 像連續虛擬內存一樣?

const int N = 10000000; 
object_type ** list = malloc(N * sizeof * list); 
for (int i=0; i < N; i++) 
    list[i] = malloc(sizeof * list[i]); 

該工程確定 - 但我發現,隨着大量的小分配的運行時顯著一部分進入到malloc()和隨後的free()的調用。我希望改變實現以分配更大的塊。對我來說最簡單的辦法就是把所有東西都分配成一個大塊。

現在我知道在用戶空間內存模型和實際物理內存之間至少存在一個虛擬化級別,但是仍然存在一個風險,那就是我會遇到難以獲得如此大的「連續」內存塊的問題?

回答

1

連續的虛擬並不意味着連續的物理。如果您的流程可以單獨分配N個頁面,那麼它也可以在一次調用中分配它們(實際上從多個角度來看都可以在一次調用中完成)。在舊的32位體系結構中,虛擬內存地址空間的有限大小是一個問題,但在64位上不再是問題。此外,即使在32位上,如果您可以單獨分配10MM,您應該可以在一次呼叫中分配相同的10MM。

這就是說,你可能需要仔細重新考慮你的設計並重新考慮爲什麼你需要在內存中分配10MM元素。

+0

謝謝你的回答。 – user422005