Почему система выделяет больше памяти при использовании указателей Windows? - PullRequest
2 голосов
/ 14 августа 2011

Я использую HeapAlloc для выделения огромного объема памяти, например, 400 МБ, но когда я проверяю использование памяти моей программой, она действительно использует примерно 1 ГБ.

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

Почему это происходит ??

1 Ответ

1 голос
/ 14 августа 2011

Когда вы распределяете память, вы сразу получаете все виртуальное адресное пространство, но оно не отображается в физической памяти, пока вы фактически не напишите на каждую страницу. Когда вы пишете на страницу в первый раз, она генерирует сбой страницы, и в этот момент ОС сопоставляется с физической страницей памяти и перезапускает операцию, которая вызвала сбой страницы.

Это делается как оптимизация - если выясняется, что ваша программа выделяет огромный объем памяти, но использует только небольшую ее часть, ОС никогда не приходится отображать физическую память, а ваша программа может просто притворяться, будто у него есть вся эта память.

...