¿Qué es copiar elisión? ¿Qué es la optimización de valor de retorno (con nombre)? ¿Qué implican?
¿En qué situaciones pueden ocurrir? ¿Qué son las limitaciones?
- Si se hizo referencia a esta pregunta, probablemente esté buscando la introducción .
- Para una descripción técnica, consulte la referencia estándar .
- Ver casos comunes aquí .
c++
optimization
c++-faq
return-value-optimization
copy-elision
Luchian Grigore
fuente
fuente
Respuestas:
Introducción
Para una descripción técnica, salte a esta respuesta .
Para casos comunes donde se produce una elisión de copia, salte a esta respuesta .
Copy elision es una optimización implementada por la mayoría de los compiladores para evitar copias adicionales (potencialmente costosas) en ciertas situaciones. Hace que la devolución por valor o paso por valor sea factible en la práctica (se aplican restricciones).
Es la única forma de optimización que elude (¡ja!) La regla de si-como: la copia de elisión puede aplicarse incluso si copiar / mover el objeto tiene efectos secundarios .
El siguiente ejemplo tomado de Wikipedia :
Dependiendo del compilador y la configuración, las siguientes salidas son todas válidas :
Esto también significa que se pueden crear menos objetos, por lo que tampoco puede confiar en que se llame a un número específico de destructores. No debe tener lógica crítica dentro de los constructores o destructores de copia / movimiento, ya que no puede confiar en que se les llame.
Si se elude una llamada a un constructor de copia o movimiento, ese constructor aún debe existir y debe ser accesible. Esto garantiza que la elisión de copia no permita copiar objetos que normalmente no se pueden copiar, por ejemplo, porque tienen un constructor de copia / movimiento privado o eliminado.
C ++ 17 : a partir de C ++ 17, Copy Elision está garantizado cuando un objeto se devuelve directamente:
fuente
Referencia estándar
Para una visión e introducción menos técnica, salte a esta respuesta .
Para casos comunes donde se produce una elisión de copia, salte a esta respuesta .
Copiar elisión se define en el estándar en:
12.8 Copiar y mover objetos de clase [class.copy]
como
El ejemplo dado es:
y explicó:
fuente
Formas comunes de elisión de copia
Para una descripción técnica, salte a esta respuesta .
Para una visión e introducción menos técnica, salte a esta respuesta .
(Nombre) La optimización del valor de retorno es una forma común de elisión de copia. Se refiere a la situación en la que un objeto devuelto por el valor de un método tiene su copia omitida. El ejemplo expuesto en el estándar ilustra la optimización del valor de retorno con nombre , ya que el objeto tiene nombre.
La optimización del valor de retorno regular ocurre cuando se devuelve un temporal:
Otros lugares comunes donde se realiza la elisión de copia es cuando se pasa un valor temporal por valor :
o cuando una excepción es lanzada y capturada por valor :
Las limitaciones comunes de la elisión de copia son:
La mayoría de los compiladores de grado comercial admiten copia de elisión y (N) RVO (según la configuración de optimización).
fuente
Copy elision es una técnica de optimización del compilador que elimina la copia / movimiento innecesario de objetos.
En las siguientes circunstancias, un compilador puede omitir operaciones de copiar / mover y, por lo tanto, no llamar al constructor asociado:
Incluso cuando se realiza una elisión de copia y no se llama al constructor de copia / movimiento, debe estar presente y accesible (como si no hubiera sucedido ninguna optimización), de lo contrario, el programa está mal formado.
Debe permitir dicha copia de elisión solo en lugares donde no afecte el comportamiento observable de su software. Copiar elisión es la única forma de optimización que permite tener (es decir, eludir) efectos secundarios observables. Ejemplo:
GCC ofrece la
-fno-elide-constructors
opción de deshabilitar la copia de elisión. Si desea evitar una posible elisión de copia, úsela-fno-elide-constructors
.Ahora, casi todos los compiladores proporcionan copia de elisión cuando la optimización está habilitada (y si no hay otra opción configurada para deshabilitarla).
Conclusión
Con cada elisión de copia, se omite una construcción y una destrucción coincidente de la copia, lo que ahorra tiempo de CPU y no se crea un objeto, ahorrando así espacio en el marco de la pila.
fuente
ABC obj2(xyz123());
es NRVO o RVO? ¿no está obteniendo una variable / objeto temporal igual queABC xyz = "Stack Overflow";//RVO