7

私はこのコードを実行しています:

#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 分間実行された後、画像が減少するため、これを引き起こすのは役に立たないコードではありません。でも何?

4

1 に答える 1

3

ワーキング セットは、主にオペレーティング システムの制御下にあります。コードが何をするかは、ワーキング セットを拡張するか削減するかを決定する際に考慮される 1 つの要因にすぎません。その他の要因には、アプリケーションがフォアグラウンドにあるかどうか、アプリケーションがどの程度アクティブであるか、ヒープ アルゴリズムがどの程度貪欲であるか、他のプロセスの要求によってどれだけのメモリ プレッシャが存在するかなどがあります。これは仕様によるものです。

ドロップはおそらく、Windows がワーキング セットのトリミングを選択したことに関連しています。最初にロードされたコードのほとんどはおそらく初期化のためだけのものであり、ループには関与していないため、OS が LRU アルゴリズムに基づいてイメージ ページを再利用するのは簡単でした。

トリミングされた部分は、画像サイズに割り当てられたワーキング セットだけではないことに注意してください。

于 2012-06-12T00:02:10.993 に答える