2012-04-21 47 views
4

我的應用程序啓動時,我正在使用malloc分配一些空間。如果我不填充此變量頂部顯示此應用程序使用的內存的0%,但如果我開始填充此變量頂部開始顯示增加使用RAM的方式我填充此數組。C malloc,僅當填充時的內存使用

所以我的問題是:不應該頂部顯示這個由malloc分配的空間作爲我的應用程序的已用空間?爲什麼當我填充這個變量時,它只會顯示從我的應用中增加的RAM使用量?

我在Ubuntu 10.10 64bits。下面是填充它的代碼:

char pack(uint64_t list, char bits, uint64_t *list_compressed, char control, uint64_t *index){ 
uint64_t a, rest; 

if(control == 0){ 
    a = list; 
} 
else{ 
    rest = list >> (64 - control); 

    a = (control == 64 ? list_compressed[*index] : list_compressed[*index] + (list << control)); 

    if(control + bits >= 64){ 
     control = control - 64; 
     //list_compressed[*index] = a; 
     (*index)++; 
     a = rest; 
    } 
} 

//list_compressed[*index] = a; 
control = control + bits; 

return control; 
} 

「malloqued」變量是list_compressed。

如果我取消註釋list_compressed填充,ram用法會增加,如果我保留註釋,則用法爲0%。

+0

http://en.wikipedia.org/wiki/Virtual_memory – 2012-04-21 20:37:09

回答

6

簡答題,沒有。在許多操作系統上,當你調用malloc時,它不會直接爲你分配內存,但只有當你訪問它時。

mallocman page

默認情況下,Linux遵循一個樂觀的內存分配策略。 這意味着當malloc()返回非NULL值時,不能保證內存真的可用, 。

+0

Linux以外的其他操作系統是否樂觀地分配內存並具有OOM殺手模擬器? – 2012-04-21 20:47:56

+0

@JonathanLeffler - AFAIK,延遲內存分配,直到在Windows和iOs上完成實際使用(但我可能是錯誤的...) – MByD 2012-04-21 20:57:34

2

現代操作系統可能只是在分配時返回虛擬內存地址,而實際上它並不指向內存塊。只有當你想使用它時纔會「分配」。

+0

這很有道理。那麼我怎麼知道有多少內存被虛擬分配? – 2012-04-21 20:35:17