ricordi che C++ separa allocazione di memoria e oggetto espressione. La nuova matrice predefinita T * p = new T[N];
alloca memoria sufficiente per gli oggetti N
e crea tali oggetti. All'altra estremità, delete[] p;
deve chiamare il distruttore di tutti quegli elementi e quindi liberare la memoria.
Mentre allocare e liberare memoria viene gestito dalla piattaforma e la memoria libera è sufficientemente identificata nel sistema operativo da un singolo valore di puntatore, la costruzione e la distruzione di oggetti è più complicata. Il numero di oggetti reali deve essere memorizzato da qualche parte e, a tale scopo, lo standard consente un'implementazione C++ per richiedere più memoria di N * sizeof(T)
. È vero che il puntatore p
punterà sempre l'inizio della matrice di N
oggetti, ma p
non deve essere lo stesso puntatore che è stato restituito dal allocatore di memoria sottostante. (Infatti, è garantito che p
sia esattamente il valore del risultato dell'allocazione sottostante compensato dalla quantità di memoria in eccesso.)
I dettagli sono interamente lasciati alla realizzazione.Alcune piattaforme forniscono tuttavia garanzie aggiuntive; per esempio, la Itanium ABI (che chiama l'extra di dati "allineamento cookie") dice che la memoria dei new T[N]
verrà presentata come segue:
+- alignof(T) --+-- sizeof(T) --+-- sizeof(T) --+-- sizeof(T) --+-- ...
| ***** [8B: N] | 1st element | 2nd element | 3rd element | .....
+---------------+---------------+---------------+---------------+-- ...
A A
| |_ result of "new T[N]"
|
|_ value returned "operator new[]()"
fonte
2012-01-30 00:46:16
Si tratta di una questione compiti a casa? – templatetypedef
è un po 'il mio compito. :) – sof
Come stai misurando la quantità di memoria allocata? –