2

HeapAlloc を使用して 400 MB などの大量のメモリを割り当てていますが、プログラムのメモリ使用量を確認すると、実際には 1 GB ほど使用しています。

//configuraciones.h
#define ANCHO_MUNDO 5000
#define ALTO_MUNDO 5000

//unidades.cpp
unidad* unidades_memoria = (unidad*)HeapAlloc(heap,  //User Heap
         NULL,ANCHO_MUNDO*ALTO_MUNDO*sizeof unidad);

unidad*** unidades = new unidad**[ANCHO_MUNDO];   //Default Heap
for(int i = 0; i < ANCHO_MUNDO;i++)
    unidades[i] = new unidad*[ALTO_MUNDO];

unidad* actual = unidades_memoria;
unsigned int id = 0;

プログラムをデバッグしたところ、このコードを実行するとメモリ使用量が増加することがわかりました

for (int y = 0; y < ALTO_MUNDO;y++)
  for (int x = 0; x < ANCHO_MUNDO;x++)
  {
    unidades[x][y] = actual;
    actual++;
    unidades[x][y]->id = id;
    id++;
    unidades[x][y]->dueño = 0;
    memset(&unidades[x][y]->addr,0,sizeof(unidades[x][y]->addr));
  }

なぜこうなった??

4

1 に答える 1

1

メモリを割り当てると、すべての仮想アドレス空間がすぐに取得されますが、実際に各ページに書き込むまで物理メモリにマップされません。初めてページに書き込むと、ページ フォールトが生成されます。その時点で、OS はメモリの物理ページにマップし、ページ フォールトを生成した操作を再開します。

これは最適化として行われます。プログラムが大量のメモリを割り当てているにもかかわらず、そのごく一部しか使用していないことが判明した場合、OS は物理メモリをマップする必要がなく、プログラムはすべてを持っているかのように振る舞うことができます。その記憶の。

于 2011-08-14T04:09:35.560 に答える