为什么系统在使用指针时会分配更多的内存?



我使用HeapAlloc来分配大量的内存,比如400mb,但是当我检查我的程序的内存使用情况时,它实际上使用了1gb。

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

为什么会这样??

当您分配内存时,您立即获得所有的虚拟地址空间,但是直到您实际写入每个页面时才将其映射到物理内存中。当您第一次写入一个页面时,它会产生一个页面错误,此时操作系统将在内存的物理页面中进行映射,并重新启动产生页面错误的操作。

它这样做是一种优化——如果你的程序分配了大量的内存,但只使用了其中的一小部分,操作系统永远不必映射物理内存,你的程序可以假装它拥有所有的内存。

最新更新