2012-02-02 15 views

Respuesta

4

Esto depende en gran medida de la implementación, pero es probable que residan en el almacenamiento automático .

Tenga en cuenta que el alcance puede ser contrario a la intuición, debido a las optimizaciones.

la siguiente:

class A 
{ 
//... 
}; 

//.... 

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

En este caso, el objeto a no necesariamente residen sólo en el interior del ámbito de la función, pero RVO puede ocurrir.

Además, al pasar por valor un objeto temporal, es posible que no se destruya inmediatamente.

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

foo(A()); 

Aquí, un temporal no es necesariamente sólo está vivo en esa línea, pero se puede construir directamente dentro de la pila argumento del método.

7

El estándar no exige ningún área de memoria (pila/pila) para ellos, pero son como las variables locales "almacenamiento automático", es decir, al final de la expresión (o más cuando están vinculadas a un ref-to -const) están destruidos.

La mayoría de las implementaciones las almacenará en la pila al igual que las variables locales.

edición:

Como James Kanze señaló: En el caso de que el tiempo de vida de un temporal se extiende a través de una constante referencia a, la ubicación de la tienda es en la mayoría de las implementaciones algo determinado por la ubicación de almacenamiento de esa referencia. Es decir, en el caso de que la referencia esté en almacenamiento estático, el temporal también lo estará (solo confirmado en gcc). (aunque en mi humilde opinión, aunque esto todavía es temporal en el sentido de las normas, es discutible si es temporal en el sentido inglés intuitivo de esa palabra)

+0

-1 y explicaré por qué. El alcance no es necesariamente el final de la expresión, incluso cuando no está vinculado a una referencia constante, pero puede extenderse aún más debido a las optimizaciones. Ver mi respuesta –

+0

@LuchianGrigore: ¿Entonces en su ejemplo, el temporal existirá después de que 'foo();' haya regresado? ¿Puedes citar el estándar donde esto está permitido? – PlasmaHH

+0

@Luchian Grigore Aquí http://stackoverflow.com/questions/9018778/will-temporary-object-be-deleted-if-there-is-no-const-reference-to-it dice que debería ser el final de expresión, ¿verdad? –

0

La mayoría (si no todas) las implementaciones las almacenan en la pila (es decir, automáticas) almacenamiento), aunque no creo que el estándar obligue a ningún lado. Ciertamente es más fácil hacerlo así, ya que el compilador debe garantizar el tiempo de vida de la variable temporal, y es posible que dicha duración abarque una llamada recursiva de la misma función, creando otra instancia de la variable temporal.

5

Depende de su duración. Los temporales que cree dentro de una función que no se vincule a una referencia estática local para alargar su tiempo de vida probablemente se crearán en la pila. Es probable que los temporarios que vincula a referencias estáticas locales se almacenen en la sección .data de su programa binario. Lo mismo se aplica a los temporales que vincula a referencias no locales. Temporarios que se crean durante la inicialización de una variable no local a la que debe vincularse una referencia en la pila de la función que produce el valor de esa variable no local.

Los objetos de excepción que representan el objeto arrojado durante el desenrollado también son temporales. Esos generalmente residen en el montón.

+0

Debe tenerse en cuenta que mi respuesta ignora la presencia de variables locales de subprocesos. alguien con experiencia en eso debería hablar y aclarar. –

+0

De hecho, aunque el OP probablemente no los tenía en cuenta, las excepciones también son temporales. Además de las listas de inicializadores en C++ 11. En cuanto a las variables locales de subprocesos, al menos en x86_64/linux se almacenarán en un segmento de memoria especial al que se accede con la ayuda del registro del segmento gs, que se establece de forma diferente para cada subproceso. – PlasmaHH

+0

¿Los objetos de excepción son temporales? O algo completamente diferente. (En §3.7, el estándar enumera cuatro "duraciones de almacenamiento": estático, hilo, automático y dinámico. A menudo me he preguntado sobre esto: los temporales claramente tienen una duración diferente, al igual que los objetos de excepción). –

Cuestiones relacionadas