2012-02-02 24 views

risposta

4

Questo è altamente dipendente dall'implementazione, ma probabilmente risiede nella memoria automatica .

Si noti che l'ambito può essere contro-intuitivo, a causa delle ottimizzazioni.

il seguente:

class A 
{ 
//... 
}; 

//.... 

A foo() 
{ 
    A a; 
    return a; 
} 

Qui, l'oggetto a non risiede necessariamente solo all'interno portata della funzione, ma RVO può verificarsi.

Inoltre, quando si passa per valore a un oggetto temporaneo, potrebbe non essere distrutto immediatamente.

void foo(A a); 
//... 

foo(A()); 

Qui, un temporaneo non è necessariamente vivo solo in quella linea, ma può essere costruito direttamente all'interno dello stack argomento del metodo.

7

Lo standard non impone alcuna area di memoria (heap/stack) per loro, ma sono proprio come le variabili locali "archiviazione automatica", ossia alla fine dell'espressione (o più a lungo quando sono associate a un ref-to -const) sono distrutti.

La maggior parte delle implementazioni li memorizzerà nello stack proprio come le variabili locali.

edit:

Come James Kanze ha sottolineato: Nel caso la durata di una temporanea viene esteso tramite un const ref-to-, la sua posizione negozio è sulla maggior parte delle implementazioni in qualche modo determinato dalla posizione di archiviazione quel riferimento. Cioè, nel caso in cui il riferimento sia nella memoria statica, lo sarà anche il temporaneo (appena confermato su gcc). (sebbene IMHO sia ancora temporaneo nel senso degli standard, è discutibile se si tratti di un temporaneo nel senso intuitivo inglese di quella parola)

+0

-1 e spiegherò perché. L'ambito non è necessariamente la fine dell'espressione anche quando non è associato a un riferimento const, ma può estendersi ulteriormente a causa delle ottimizzazioni. Vedi la mia risposta. –

+0

@LuchianGrigore: Quindi nell'esempio, il temporaneo esisterà dopo che 'foo();' è ritornato? puoi citare dallo standard in cui questo è permesso che accada? – PlasmaHH

+0

@Luchian Grigore Qui http://stackoverflow.com/questions/9018778/will-temporary-object-be-deleted-if-the-is-no-const-reference-to-it dice che dovrebbe essere la fine di espressione, non è vero? –

0

La maggior parte (se non tutte) le implementazioni le memorizzano nello stack (cioè automatico stoccaggio), anche se non credo che lo standard imponga ovunque. È certamente più facile farlo in questo modo, poiché il compilatore deve garantire la durata della variabile temporanea ed è possibile che detta durata comprenda una chiamata ricorsiva della stessa funzione, creando un'altra istanza della variabile temporanea.

5

Dipende dalla loro durata. I temporanei creati all'interno di una funzione che non si associa a un riferimento statico locale per allungarne la durata verranno probabilmente creati nello stack. I temporanei che si associano ai riferimenti statici locali saranno probabilmente archiviati nella sezione .data del programma binario. Stesse prese per i provvisori che leghi a riferimenti non locali. I temporanei creati durante l'inizializzazione di una variabile non locale diversi da quello associato a un riferimento dovrebbero essere sulla pila della funzione che produce il valore di quella variabile non locale.

Anche gli oggetti di eccezione che rappresentano l'oggetto generato durante lo svolgimento sono temporanei. Quelli di solito risiedono nell'heap.

+0

Va notato che la mia risposta ignora la presenza di variabili locali del thread. qualcuno con esperienza dovrebbe parlare e chiarire. –

+0

Infatti, sebbene l'OP probabilmente non li avesse in mente, anche le eccezioni sono temporanee. Così come gli elenchi di intializer in C++ 11. Per quanto riguarda le variabili locali del thread, almeno su x86_64/linux saranno memorizzate in un segmento di memoria speciale a cui si accede con l'aiuto del registro del segmento gs, che è impostato in modo diverso per ogni thread. – PlasmaHH

+0

Gli oggetti di eccezione sono provvisori? O qualcos'altro interamente. (In §3.7, lo standard elenca quattro "durate di memorizzazione": statico, thread, automatico e dinamico. Mi sono chiesto spesso: i temporaries hanno chiaramente una durata diversa, come fanno gli oggetti eccezione.) –

Problemi correlati