2011-11-28 12 views
7

Possiamo usare il posizionamento nuovo per creare un oggetto nella memoria pre-allocata.Creare oggetti nella memoria pre-allocata

Consideriamo il seguente esempio:

char *buf = new char[1000]; //pre-allocated buffer 
string *p = new (buf) MyObject(); //placement new 
string *q = new (buf) MyObject(); //placement new 

Ho creato due oggetti nel buffer di pre-assegnati. I due oggetti vengono creati casualmente nel buffer o creati in blocchi di memoria contigui? Se continuiamo a creare più oggetti nel buffer e vogliamo che vengano memorizzati in blocchi di memoria contigui, cosa dovremmo fare? Creare prima una matrice nel buffer e poi creare ogni oggetto negli slot di elemento dell'array?

+1

"Se continuiamo a creare più oggetti nel buffer e vogliamo che vengano archiviati in blocchi di memoria contigui, cosa dovremmo fare?" Usa 'std :: vector', è un array dinamico memorizzato contiguo. – GManNickG

risposta

5

I due oggetti vengono entrambi creati nella stessa posizione di memoria, ovvero buf. Questo è comportamento non definito (a meno che gli oggetti non siano POD).

Se si desidera allocare più oggetti, è necessario incrementare il puntatore, ad es. buf + n * sizeof(MyObject), ma attenzione ai problemi di allineamento

Inoltre, non dimenticare di chiamare distruttori quando hai finito.

+1

Poiché il buffer è stato allocato con 'new', ha allineamento per supportare qualsiasi tipo (inclusi gli array). (Non che ti sbagli in generale, solo in questo caso è al sicuro.) – GManNickG

+0

@GMan: Grazie, buon punto. Suppongo che sia necessaria un'attenzione particolare se si desidera inserire oggetti di tipi diversi nella memoria. –

+0

+1 BTW, cosa significa POD qui? –

3

La seguente riga di codice:

string *p = new(adr) MyObject(); 

creerà un oggetto MyObject all'indirizzo adr. Quindi la prossima volta che si crea un altro oggetto, si sa che la memoria a adr è utilizzato dal primo oggetto, in modo che il prossimo oggetto dovrà essere creato il adr + sizeof(MyObject):

string *q = new(adr + sizeof(MyObject)) MyObject(); 

Il punto della memoria pre-assegnati è così che non stai allocando in fase di esecuzione, che è piuttosto lento. Si fa una grande allocazione all'inizio del ciclo/programma e quindi è sufficiente utilizzare blocchi di tale allocazione. Il lato negativo è che devi gestire la tua memoria, il che significa che devi capire dove mettere i tuoi oggetti che diventa complicato quando il tuo pool di memoria viene frammentato!

+0

if adr = static_cast (byteaddr) allora si dovrebbe fare: string * q = new (adr + 1) MyObject(); –

Problemi correlati