2013-05-05 28 views
2

我有一個應用程序提前知道malloc/free操作的順序。我想做一個預先計算來減少最大內存使用量。那裏是否有任何資源(C++實現/研究論文)?預先知道模式的內存分配

更準確地說,相同的malloc/free操作序列會重複多次(每個循環結束時都會釋放所有內容)。所以我可以承擔一些計算來優化內存使用。

+3

我想你需要指定太多所使用的編程語言。 – catholicon 2013-05-05 07:02:33

+0

謝謝,補充(C++)。 – loh 2013-05-05 07:08:09

+0

我不知道有關這方面的論文,但'malloc/free操作的相同序列會重複多次(在每個循環結束時,所有內容都將被釋放)''聽起來像您可以創建特定大小的私有堆棧,分配給它們然後釋放整個堆。你使用哪個平臺? – 2013-05-05 07:20:21

回答

0

假設你想要達到的效果是儘量減少分配內存所花費的時間,並可能改善緩存局部性,這聽起來很簡單,實際上。

只要選擇內存管理器(編寫一個或使用預先存在的如Hoard)。然後,讓內存管理器在程序開始時分配一個週期內使用的最大內存量。

主要問題是計算這個內存量。一個簡單的解決方案是使用一個分配器來執行一個循環,除了將malloc/free包裝在一起,它還可以跟蹤當前內存使用情況和最大使用情況。在你的週期結束時,這個最大值是你在開始時應該分配多少。

有一點需要注意的是分配的內存中的碎片可能會導致需要額外的分配。這通常可以通過一個好的內存管理器來避免。在最壞的情況下,您可能需要分別跟蹤爲每個分配大小分配的最大內存。作爲旁註,如果您使用的是C++,爲什麼使用malloc/free而不是new/delete?

0

更準確地說,malloc/free操作的相同序列是 多次重複(在每個循環結束時,所有內容都被釋放)。所以 我可以負擔一些計算來優化內存使用。

對於內存使用情況,這不是一個難以解決的問題。同樣的內存將被重新分配用於相同的目的,所以如果你一遍又一遍地分配相同的內存塊,它不會「浪費」內存。

既然你說了,mallocfree,我們是在說老式的「C」型堆用法嗎?所以沒有構造函數或析構函數需要擔心?那麼爲什麼不創建給定類型的元素的數組,例如

struct X 
    { 
     ... 
    }; 

舊代碼:

X* px[10]; 
    for(i = 0; i < 10; i++) 
    { 
     px[i] = malloc(sizeof(X)); 
     ... 
    } 

,而不是做:

X* px[10]; 
    X* xx = malloc(sizeof(X)*10); 
    for(i = 0; i < 10; i++) 
    { 
     px[i] = &xx[i]; 
    } 
相關問題