2009-10-29 17 views
17

Se std :: vector e gli amici sono auto ridimensionamento, significa che se dichiaro un vettore in questo modo:contenitori STL nello stack e heap

std::vector<string> myvec; 

Poi sarà ridimensionata usando più dello stack, mentre :

std::vector<string> *myvec = new std::vector<string>(); 

Ridimensionare utilizzando più heap?

+2

È inoltre possibile implementare un vettore di "dimensione fissa" per archiviare tutto questo nello stack. Funziona abbastanza bene e potrebbe essere un'ottimizzazione. Tuttavia, il costo è che non sarà infinitamente estensibile> dovrai accontentarti di un limite massimo e consumerà sempre molto spazio. –

+0

Questo è interessante, quindi un vettore "di dimensioni fisse" è interamente in pila? – Benj

+1

Non conosco un vettore 'a dimensione fissa', ma se vuoi i tuoi dati fissi nello stack, considera l'utilizzo di std :: tr1 :: array, che sembra simile. – stefaanv

risposta

24

I vettori allocano sullo heap nel loro interno.

L'unica cosa che si paga nello stack per un bector basato sullo stack è di un paio di byte, il buffer interno verrà sempre assegnato dall'heap.

Così efficacemente quando si esegue un vec = new vector() si assegna una piccola quantità, che potrebbe non essere veramente buona.

+0

Ah ok, quindi i vettori dichiarati nello stack eliminano la memoria che hanno usato una volta che escono dall'ambito allora? – Benj

+0

@Benj: Sì, puliranno la memoria quando escono dal campo di applicazione. – Naveen

+6

@ Benj: nota che i vettori puliscono solo la memoria che hanno assegnato loro stessi. Se aggiungi oggetti allocati all'heap (con 'new') a un vettore, allora sei responsabile della chiamata 'delete' su di essi. Forse lo sapevi già, ma volevo menzionarlo nel caso in cui ... – StackedCrooked

1

std :: vector ha sempre il suo buffer allocato su heap. Quindi, indipendentemente da dove viene assegnato il ridimensionamento del vettore, questo influirà solo sull'heap.

8

Nel primo caso, si sta creando il vettore in pila. Ciò non significa che tutti gli oggetti interni dei vettori siano anch'essi in pila. In effetti, il vettore assegnerà comunque la memoria necessaria per tenere gli oggetti solo nell'heap. Questo perché, per allocare sullo stack, è necessario sapere quanti oggetti creare. Ma questa informazione non è disponibile, quindi l'unica opzione rimanente è allocare la memoria per l'oggetto contenuto dall'heap.

+0

Va anche notato che è normale che std :: string mantenga alcuni "oggetti" interni nello stack. In realtà, std :: vector è proibito farlo? –