2015-04-29 73 views
4

這應該填充我的記憶每一秒約100 MB。我使用gnome-systemmonitor和htop跟蹤memoryusage。但不知何故,它不。爲什麼?新的不分配內存

#include "unistd.h" 
#include <iostream> 

int main(int argc, char *argv[]) 
{ 
    while (true){ 
     std::cout << "New one" << std::endl; 
     new char[100000000]; 
     sleep(1); 
    } 
    return 0; 
} 

運行:

g++ -std=c++11 -O0 main.cpp; ./a.out 
+2

懶惰的分配,最有可能的。嘗試寫入分配數組的東西。 –

+1

我原本以爲它與[this](http://stackoverflow.com/q/25668420/1708801)相關,但它似乎甚至與'5.1' gcc並沒有做新的相同的優化,鐺和[godbolt顯示海灣合作委員會確實呼籲新](http://goo.gl/zXaTlQ)...所以保羅很可能是正確的...另一方面,鏗鏘會優化呼籲新的'-O1'和更大。 –

+0

您已經評價過100MB將是char [104857600]?我想這個新的命令會被優化,因爲它沒有理由在那裏...... – Nidhoegger

回答

8

因爲你不使用它,Linux並懶分配,這樣就不會真正使用之前將任何映射內存頁面。

如果你把像一些代碼:

char* test = new char[100000000]; 
test[0] = 'a'; 
test[4096] = 'b'; 
... 

你應該看到它的實際消耗系統內存。

2

我只看到clang optimize away calls to new,並且通常編譯器在使用-O0時不會執行如此積極的優化。

我們可以從godbolt看到gcc確實不調用非常相似的代碼優化掉,以new

.L2: 
movl $100000000, %edi 
call operator new[](unsigned long) 
movl $1, %edi 
call sleep 
jmp .L2 

所以最有可能的Paul is correct和懶惰分配參與,因此一旦寫入分配的內存你會看到它被使用。