Quello che segue rappresenta ciò che di solito accade in C ++. Alla fine, elencherò alcuni possibili motivi per cui potrebbe non essere il caso.
Di solito, quando scrivi MyClass *clz = new MyClass();
, l'operatore new
alloca sizeof MyClass
byte sull'heap, chiama il costruttore del suo membro e restituisce un puntatore alla memoria allocata.
Poiché stai includendo vector
come membro, tutti i membri del vettore verranno inclusi nell'allocazione dell'heap sizeof MyClass
. Questo dipende dall'implementazione, ma di solito è una dimensione, una capacità e un puntatore a un'altra allocazione dell'heap che viene utilizzata per una matrice di dimensioni variabili di MyOtherClass
es. In altre parole, potresti ottenere 2 allocazioni di heap con new
originale.
Se, tuttavia, hai appena incluso MyClass clz;
come variabile locale, il sizeof MyClass
sarà allocato nello stack. Tuttavia, l'array valido all'interno di vector
può ancora essere allocato nello heap.
Ma , essendo questo C ++, quanto sopra potrebbe non essere vero. Innanzitutto, è possibile sovrascrivere l'operatore new
per fare qualcos'altro. In teoria, potresti farlo allocare in pila, usando alloca
per dire, anche se questa sarebbe una pessima idea.
In secondo luogo, l'implementazione di std::vector
può variare considerevolmente. Un'ottimizzazione, nota come ottimizzazione dei piccoli vettori, se possibile, memorizza alcuni oggetti nella sua struct piuttosto che nell'heap. In determinate circostanze, ciò può migliorare le prestazioni anche se è probabilmente improbabile nel tuo caso (dipende dall'implementazione di vector
e MyOtherClass
). Inoltre, e più probabilmente nel tuo caso, l'implementazione potrebbe non eseguire un'allocazione interna dell'heap fino a quando non inserisci qualcosa. Quindi new MyClass
non esegue 2 allocazioni dell'heap ma potresti ottenerne una o più mentre riempi il vettore nel programma in esecuzione.