1

我想明白爲什麼數據動態分配被多次使用比代碼直接指定或與malloc單個呼叫分配一個這麼多的內存。內存分配和進程的內存使用

實例

作爲實例,我提出了以下兩個代碼,在C:

test1.c:INT x被與malloc

int main (void) 
{ 
    int *x; 
    int i, n=1048576; //n=1024*1024; 

    printf("size = %lu\n", n* sizeof(int)); 

    for(i=0; i<n; i++) 
    { 
     x = malloc(sizeof(int)); 
     *x=i; 
    } 
    printf("Look at top and then press something to finish.");fflush(stdout); 
    getc(stdin); 
    return 0; 
} 

分配我沒有使用免費在這裏保持簡單。 當程序正在等待的互動,我期待在另一個終端上的功能,它顯示了我:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND          
1384 root 20 0 41300 34076 1300 S 0.0 3.3 0:00.47 test1 

test2.c中:INT X不是動態分配

int main (void) 
{ 
    int x[1048576]; //x[1024*1024] 
    int i, n=1048576; 

    printf("size = %lu\n", n* sizeof(int)); 

    for(i=0; i<n; i++) 
    { 
     x[i]=i; 
    } 
    printf("Look at top and then press something to finish.");fflush(stdout); 
    getc(stdin); 
    return 0; 
} 

和頂級顯示我:

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND          
1352 root 20 0 12404 5500 1304 S 0.0 0.5 0:00.05 test2 

我也做了一個第三碼,也有相同的結果是test2的,在這裏我使用:

x = malloc(n*sizeof(int)); 
for(i=0; i<n; i++) 
    { 
     x[i]=i; 
    } 

爲什麼在內存使用過程中有這麼多差異?這是因爲malloc請求新的內存頁面,並有內存被浪費?或malloc分配更多的內存?

test1使用3.3%的總內存和test2使用0.5%

環境:

我執行這些測試在CentOS 5 64位內部搬運工。在虛擬環境

內存:

$ free -m 
       total  used  free  shared buff/cache available 
Mem:   995   98   845   3   51   808 
Swap:   1162   194   967 
+1

[Malloc vs自定義分配器可能重複:Malloc有很多開銷。爲什麼?](http://stackoverflow.com/questions/13064850/malloc-vs-custom-allocator-malloc-has-a-lot-of-overhead-why) –

+0

看看這個答案: http:///stackoverflow.com/questions/10540845/linux-heap-structure-and-the-behaviour-with-malloc-and-free – JurekM

+0

這與'malloc vs自定義分配器'有關,但不完全相同。 –

回答

4

每一個內存分配必須被追蹤,以便free()可以釋放的空間再利用。實際上,這意味着有一個最小的內存大小被分配;它對於32位程序可以是8或16字節,對於64位程序可以是16-32字節(這取決於系統和正在使用的C庫的版本)。

當你分別分配一百萬個整數時,它們中的每一個都使用8-32個字節,所以你實際上已經使用了8-32MB的內存。當你在堆棧中的一個數組中分配一百萬個整數時,你使用的是4MB的內存。

因此,您會發現進程大小存在實質性差異。

當然,第一個程序幾乎泄漏了所有的內存,但這與您所問的問題是相切的。

+1

Jonathan很好的答案!但是,請注意,可能不需要最後一句,因爲OP提到他爲了簡單而故意不包含'free()'。 :) – gsamaras

+1

是的;我的最後一句話不是100%必要的,但它也不是有害的。通過擺脫「免費」而獲得的簡單性非常重要;代碼將需要「一百萬」指針來存儲百萬分配的整數,增加了內存開銷(需要4或8個MiB)。 –

2

系統需要每一個用戶請求一些內存時間做一些家政服務。只需調用free就可以了,只要您的指針足以讓系統取消分配內存。

所以,在你的第一個例子,你請求的內存n倍,而在第二隻有一次。你打算使用的內存是相同的,但系統必須「記住」的信息不是。