Los objetos temporales IMO se almacenan en una memoria dinámica (de montón), pero no estoy seguro. ¿Puedes confirmar o negar mis pensamientos?¿Dónde se almacenan los objetos temporales?
Respuesta
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.
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)
-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 –
@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
@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? –
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.
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.
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. –
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
¿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). –
- 1. ¿Dónde se almacenan las tablas temporales en el servidor sql?
- 2. ¿Dónde se almacenan los ivars sintetizados?
- 3. ¿Dónde se almacenan los mensajes flash?
- 4. ¿Dónde se almacenan los "Certificados" en Firefox?
- 5. ¿Dónde se almacenan los módulos de python?
- 6. ¿Dónde se almacenan los metadatos del puntero?
- 7. ¿Dónde se almacenan los archivos evtx archivados?
- 8. ¿Dónde se almacenan las macros?
- 9. iPhone: ¿Dónde se almacenan NSUserDefaults?
- 10. ¿Dónde se almacenan los atributos de Java HttpSession?
- 11. ¿Dónde se almacenan los paquetes del sistema Java?
- 12. ¿Dónde se almacenan los datos enviados por UDP?
- 13. ¿Dónde se almacenan los bloques CMS estáticos de Magento?
- 14. ¿Dónde se almacenan los métodos en la memoria?
- 15. ¿Cómo cambiar dónde se almacenan los repositorios de Subversion?
- 16. ¿Dónde se almacenan los archivos de logcat de Android?
- 17. ¿Dónde se almacenan las imágenes dentro de los programas?
- 18. ¿dónde se almacenan los marcadores de sincronización de Google Chrome?
- 19. ¿Dónde se almacenan los volcados centrales en Mac?
- 20. ¿Dónde se almacenan los valores de DataValueField para CheckBoxList?
- 21. ¿Dónde se almacenan las propiedades. Configuración predeterminada?
- 22. ¿Dónde almacenan las cookies los navegadores?
- 23. ¿Cómo se almacenan los objetos Java en HttpSession?
- 24. ¿Dónde se almacenan las compras de InAPP?
- 25. ¿Dónde se almacenan las preferencias compartidas?
- 26. Cómo | ¿Dónde se almacenan las variables cerradas?
- 27. ¿Los objetos temporales son x valores?
- 28. ¿Dónde se almacenan las clases de Java en Oracle?
- 29. ¿Dónde puedo encontrar programáticamente dónde se almacenan los archivos de registro log4j?
- 30. Liberación de objetos COM temporales
"IMO"? ¿Por qué fue esa tu opinión? ¿Qué te llevó a asumir eso? –