2014-09-12 24 views
0

我需要爲每個迭代一次臨時數組分配空間。我嘗試使用realloc每次迭代來優化內存使用。像這樣:我可以使用std :: realloc來防止冗餘內存分配嗎?

int *a = (int*)std::alloc(2 * sizeof(int)); 
for(int i=0; i<N; ++i) 
{ 
    int m = calculate_enough_size(); 
    a = (int*)std::realloc(m * sizeof(int)); 
    // ... 
} 
std::free(a); 

N是一個很大的數字,例如1000000。有每個迭代的例子m的值:8,2,6,10,4,8

我是否正確,當我在每次迭代realloc a?它是否防止冗餘內存分配?

+0

您是否需要在迭代中維護數組的內容? – 2014-09-12 11:20:26

+0

您可以保存當前的迭代次數並且只在需要更多大小時纔可以重新分配 – user1781290 2014-09-12 11:21:26

+0

在每次重新分配之後,沒有'a'填充'm'個新值 – user1312837 2014-09-12 11:22:43

回答

0

如果您事先能夠獲得所有尺寸,請在週期前分配您需要的最大尺寸,然後根據需要使用。

另一方面,如果你不能這樣做,那麼重新分配是一個很好的解決方案,我想。

您還可以進一步需要更大的尺寸時,只有重新分配優化的解決方案:

int size = 0; 
for(int i = 0; i < N; ++i) 
{ 
    int new_size = calculate_enough_size(); 
    if (new_size > size){ 
     a = (int*)std::realloc(new_size * sizeof(int)); 
     size = new_size; 
    } 

    // ... 
} 

這樣你將需要更少的重新分配(其中一半是在隨機的情況下)。

+0

在迭代之前不可能獲得最大'm'值 – user1312837 2014-09-12 11:29:34

+0

「僅在需要更大尺寸時重新分配」。爲什麼它更好,然後重新分配每個迭代? – user1312837 2014-09-12 11:30:33

+0

@ user1312837因爲您需要更少的reallocs。 – grzkv 2014-09-12 11:33:48

3

首先,realloc需要2個參數。首先是原始指針,第二個是新尺寸。您試圖將大小作爲原始指針傳遞,代碼不應編譯。其次,強制性提醒:不要過早優化。除非您測量並發現分配是瓶頸,否則請使用std::vector

+2

使用std :: vector是一個很好的建議 – trenki 2014-09-12 12:15:44

1

我注意到幾個問題是:

  • 的realloc應該在你想舊的價值留在記憶裏,如果你沒有理會舊值在您的評論使用一個提到的情況下使用只是分配。

  • 如果分配的內存不足以用於新數據,請僅分配新內存,請在再次分配之前檢查已分配內存的大小。

請參閱將採取的上述問題護理示例代碼:

int size = 2; 
int *a = (int*)std::alloc(size * sizeof(int)); 

for(int i=0; i<N; ++i) 
{ 
    int m = calculate_enough_size(); 
    if(m > size) 
    { 
     size = m; 
     std::free(a); 
     a = (int*)std::alloc(size * sizeof(int)); 
    } 
    // ... 
} 
std::free(a); 

您也可以進一步優化,通過分配一些額外的內存內存分配,例如:

size = m*2; //! 

爲了更好地理解這一步,我們舉一個例子假設m = 8,那麼你會分配內存= 16,所以當現在m變成10,12最多16個時,不需要再次分配存儲器。

相關問題