Allocazioni di grandi dimensioni di memoria

di Unqualunque il
6 risposte
Buongiorno a tutti, sto facendo degli esperimenti con l'allocazione di grandi blocchi di memoria ma non mi tornano i conti. Vengo subito al codice...

Una struttura dati costituisce l'elemento base dell'allocazione:
typedef struct tag_Voxel {
	size_t u, v, w;
	_Bool b;
	void* r;
} _Voxel;
Il suo allocatore:
_Voxel * AllocateFirstLevel(size_t n)
{
	return (_Voxel*)malloc( sizeof(_Voxel) * n );
}
La chiamata:
size_t n = 360000000ull;
_Voxel *vl = AllocateFirstLevel(n);

I miei conti sarebbero questi:

Numero di elementi: 360 000 000 ( come assegnato alla chiamata)
Dimensione del singolo elemento: 40 bytes ( sizeof(_Voxel) )
Dimensione della allocazione: 14 400 000 000 bytes ( sizeof(_Voxel) * n )

Se un MB fosse 1.0E+006 byte, otterrei 14400 MB, se invece fosse 1024×1024 allora sarebbero 13733 MB. Mi sembrano comunque tanti.

Nella Gestione attività di Windows 8 il mio Tester.exe cresce solo di 26.9 MB dopo la l'allocazione.

Dove sbaglio i miei conteggi?

6 Risposte

  • Perché 40 byte? Lavori a 64 bit?

    Qual è il valore di vl ?
  • Ciao,
    si lavoro a 64 bit.
    Caspita, anche il _Bool si prende 8 byte (!)

    Il valore del puntatore ritornato è 000000014004e048. Sembrerebbe un indirizzo valido.
  • Aggiungi, dopo l'allocazione, una inizializzazione

    ZeroMemory(vl, sizeof(_Voxel) * n);

    (windows.h)
  • Centro! Ora i conti tornano!
    Non ci avevo proprio pensato. In pratica il sistema operativo non dispone la memoria assegnata finché non è inizializzata.
  • Hai chiari i concetto di memoria reserved committed accessed ?
  • No, infatti. Oramai è arrivato il momento di approfondire.
Devi accedere o registrarti per scrivere nel forum
6 risposte