我運行這段代碼:內存映像下降
#include <iostream>
#include <cstddef>
int main(int argc, char *argv[]){
int a1=0, a2=0;
int a3,a4;
int b1=++a1;
int b2=a2++;
int*p1=&a1;
int*p2=&++a1;
size_t st;
ptrdiff_t pt;
int i=0;
while(true){
printf("i: %d",i++);
}
printf("\n\ni now is: %d\n",i);
return 0;
}
爲什麼我觀察圖像存儲器這樣的下降(fiolet): 傳說:
我做了這個一般的Win32項目,不是CLR。 我改變了代碼,所以我會看到int最終成爲負數。現在while()是:
int i=0;
while(0<++i){
printf("i: %d",i++);
}
printf("\n\ni now is: %d\n",i);
很奇怪:請看30000次迭代後發生了什麼。爲什麼我們在圖像存儲器中看到這些波動?我現在可以看到,這可能與VMMap本身有關,因爲只有當我選擇「啓動&跟蹤新進程」,而不是「查看正在運行的進程」並指向運行從VS2010啓動的exe時,纔會發生這種情況。下面是過程的屏幕「推出&追蹤」:
我也觀察到的記憶巨大的分頁,這與該下降的圖像(該尋呼近加快並迅速引發內存的限制大致開始,我已設置爲2GB): ,這裏是只能從VS2010「看」(拼命地跑正在運行的進程):
所以也許有些問題受到.NET應用程序的內存管理髮生在這裏? 我還在等待我的int跨越兩個補碼的邊界。
好吧......我必須再次編輯:事實證明,正如先前的想法 - 當進程僅被查看(未啓動)時,存在遞減的內存映像效果。下面是連接同一過程的畫面,10分鐘後(仍然在等待轉彎INT爲負):
在這裏它是:
所以最大的利好2補上我的機2 147 483 647 和最小負爲-2 147 483 648,什麼是容易驗證這種方式:
#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();
它給了我同樣的結果:-2 14 7 483 648和2 147 483 647
回到開始 當我評論一切,但while()循環 - 同樣的事情發生:圖像正在減少後,進程運行約10分鐘,所以它不是無用的導致這種情況的代碼。但是什麼?
你可以一遍又一遍地重現這種內存消耗模式嗎? – dirkgently
也許printf日誌佔用一些圖形空間? –
這是怎麼可能,該圖像descresing? @dirkgently,到目前爲止,這仍然是運行,因爲我想看看int最終會是什麼時候 – 4pie0