La elisión de copia (u omisión de copia) es una técnica de optimización del compilador que evita la copia innecesaria de objetos. Hoy en día, casi todos los compiladores lo usan. Entendámoslo con la ayuda de un ejemplo.
#include <iostream> using namespace std; class B { public: B(const char* str = "\0") //default constructor { cout << "Constructor called" << endl; } B(const B &b) //copy constructor { cout << "Copy constructor called" << endl; } }; int main() { B ob = "copy me"; return 0; }
La salida del programa anterior es:
Constructor called
¿Por qué no se llama al constructor de copias?
Según la teoría, cuando se construye el objeto «ob», se usa un constructor de argumentos para convertir «cópiame» en un objeto temporal y ese objeto temporal se copia en el objeto «ob». Así que la declaración
B ob = "copy me";
debe ser desglosado por el compilador como
B ob = B("copy me");
Sin embargo, la mayoría de los compiladores de C++ evitan los gastos generales de crear un objeto temporal y luego copiarlo.
The modern compilers break down the statement B ob = "copy me"; //copy initialization as B ob("copy me"); //direct initialization and thus eliding call to copy constructor.
Sin embargo, si aún queremos asegurarnos de que el compilador no elimine la llamada para copiar el constructor [deshabilitar la elisión de copia], podemos compilar el programa usando la opción «-fno-elide-constructors» con g ++ y ver el resultado de la siguiente manera :
aashish@aashish-ThinkPad-SL400:~$ g++ copy_elision.cpp -fno-elide-constructors aashish@aashish-ThinkPad-SL400:~$ ./a.out Constructor called Copy constructor called
Si se usa la opción «-fno-elide-constructors», se llama al primer constructor predeterminado para crear un objeto temporal, luego se llama al constructor de copia para copiar el objeto temporal a ob.
Referencia:
http://en.wikipedia.org/wiki/Copy_elision
Este artículo fue compilado por Aashish Barnwal y revisado por el equipo de GeeksforGeeks. Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA