sovraccarico di memoria di puntatori in c / c ++
Domanda
Sono su una piattaforma a 64 bit, in modo da tutte le ADR di memoria sono 8 byte.
Quindi, per ottenere una stima del l'utilizzo della memoria di un array, dovrei aggiungere 8 byte alla sizeof (DATATYPE) per ogni voce nella matrice.
Esempio:
short unsigned int *ary = new short unsigned int[1000000]; //length 1mio
//sizeof(short unsinged int) = 2bytes
//sizeof(short unsinged int*) = 8 bytes
Così fa ogni voce occupa 10bytes? e sarà la mia matrice di lunghezza a 1 milione di conseguenza utilizzare atleast 10megabytes?
grazie
Soluzione
No, non si ottiene un puntatore per ogni indice di array. Si ottiene un singolo puntatore che indica la matrice, che è un blocco contiguo di memoria, che è il motivo per cui l'indirizzo di qualsiasi indice può essere calcolato l'indice stesso più l'indirizzo matrice.
Ad esempio, se la variabile a
conosciuta dal 0xffff0012
posizione di memoria è impostato 0x76543210
, allora potrebbero essere disposti in memoria, come:
+-------------+ This is on the stack or global.
0xffff0012 | 0x76543210 |
+-------------+
+-------------+ This is on the heap (and may also
0x76543210 | a[ 0] | have some housekeeping information).
+-------------+
0x76543212 | a[ 1] |
+-------------+
0x76543214 | a[ 2] |
+-------------+
0x76543216 | a[ 3] |
+-------------+
: :
+-------------+
0x7672B68E | a[999999] |
+-------------+
e si può vedere che l'indirizzo dell'indice n
è 0x76543210 + n * 2
.
Quindi sarà effettivamente avere un puntatore di 8 byte e un milione di pantaloncini 2 byte, che, nel suo caso, ammonta a 2,000,008 byte.
Questo è in cima ad ogni testa malloc
servizio di pulizia che, come il puntatore stesso, è minuscola rispetto al vostro allineamento attuale.
Altri suggerimenti
No, c'è solo un singolo puntatore qui, non è un puntatore per ogni voce. La vostra stima dimensione è 1000000 * 2 + 8.