2012-04-02 54 views
4

我有一個代碼,它以指數方式增加內存大小(由指針標識)。
相反的realloc(),我用malloc()其次memcpy() ...memcpy在特定點後減少的時間

int size=5,newsize; 
int *c = malloc(size*sizeof(int)); 
int *temp; 

while(1) 
{ 
    newsize=2*size; 
    //begin time 
    temp=malloc(newsize*sizeof(int)); 
    memcpy(temp,c,size*sizeof(int)); 
    //end time 
    //print time in mili seconds 
    c=temp; 
    size=newsize; 
} 

因此得到複製的字節數成倍增加。

該任務所需的時間也隨着大小的增加而線性增加。然而,在某個點之後,所花費的時間突然減少到非常小的值,然後保持不變。

我記錄了類似代碼的時間,複製了我自己類型的數據。

5 -> 10 - 2 ms 
10 -> 20 - 2 ms 
. 
. 
2560 -> 5120 - 5 ms 
. 
. 
20480 -> 40960 - 30 ms 
40960 -> 91920 - 58 ms 
367680 -> 735360 - 2 ms 
735360 -> 1470720 - 2 ms 
1470720 -> 2941440 - 2 ms 

這個時間下降的原因是什麼?尺寸較大時是否會調用更優化的memcpy方法?

+5

不錯的內存泄漏... – Macmade 2012-04-02 11:23:27

回答

6

由於您的代碼不會在舊內存塊上執行free(),因此請確保新分配不會開始失敗。當給出一個NULL指針時,可能會出現memcpy()錯誤,因此完成得非常快。

+1

幾倍(或無限的,如問題中所示)加倍5確實非常快速地提供大幅度的大尺寸。無論你有多少空閒空間,你都會很快達到允許的最大塊大小,迫使malloc也快速恢復。 – TheBlastOne 2012-04-02 11:29:56

+0

謝謝..這可能是原因,一定要檢查。 – tss 2012-04-02 11:32:54

2

你檢查了返回值malloc

我認爲它只是在某個點後失敗。