私はこのコードを実行しています:
#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):
凡例:
CLRではなく、この一般的なWin32プロジェクトを作成しました。コードを変更したので、最終的に 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に設定したRAM制限をすぐにトリガーしました):
そして、ここに実行中のプロセスが「表示」されるだけです(VS2010から実行されます) :
.NET アプリケーションのメモリ管理に関する問題がここで発生する可能性がありますか? int が 2 つの補数の境界を越えるのをまだ待っています。
うーん...もう一度編集する必要があります。以前に考えられていたように、メモリイメージの減少効果は、プロセスが表示されているだけの場合(起動されていない場合)にも存在することがわかりました。以下は、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 147 483 648 および 2 147 483 647
while() ループ以外のすべてにコメントすると、最初に戻ります。同じことが起こります。プロセスが約 10 分間実行された後、画像が減少するため、これを引き起こすのは役に立たないコードではありません。でも何?