Hvorfor system tildeler mere hukommelse, når du bruger peger Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg bruger HeapAlloc til at tildele en stor mængde hukommelse, som 400 MB, men når jeg tjekker hukommelsesbrugen af ​​mit program, bruger det virkelig som 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;


Jeg debugged mit program, og jeg indså, at hukommelsesforbruget icreases, når denne kode udføres


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));
  }


Hvorfor sker dette?

Bedste reference


Når du tildeler hukommelse, får du al det virtuelle adresserum med det samme, men det bliver ikke kortlagt til den fysiske hukommelse, før du faktisk skriver til hver side. Når du skriver til en side for første gang, genererer den en sidefejl , og på hvilket tidspunkt vil operativsystemet kortlægge en fysisk side i hukommelsen og genstarte den operation, der genererede sidefelten.


Det gør det som en optimering - hvis det viser sig, at dit program tildeler en stor mængde hukommelse, men kun bruger en lille del af det, skal operativsystemet aldrig kortlægge fysisk hukommelse, og dit program kan bare foregive som om det har alle af den hukommelse.