Copiar elisión en C++

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *