Рубрики

Скопируйте elision в C ++

Исключение копирования (или исключение копирования) — это метод оптимизации компилятора, который позволяет избежать ненужного копирования объектов. Теперь дни, почти каждый компилятор использует его. Позвольте нам понять это с помощью примера.

#include <iostream>

using namespace std;

   

class B

{

public:    

    B(const char* str = "\0") // конструктор по умолчанию

    {

        cout << "Constructor called" << endl;

    }    

      

    B(const B &b)  // копировать конструктор

    {

        cout << "Copy constructor called" << endl;

    

};

   

int main()

    B ob = "copy me"

    return 0;

}

Вывод вышеуказанной программы:

Constructor called

Почему конструктор копирования не вызывается?
Согласно теории, когда объект «ob» создается, конструктор с одним аргументом используется для преобразования «copy me» во временный объект, и этот временный объект копируется в объект «ob». Итак, утверждение

     B ob = "copy me"; 

должен быть разбит компилятором как

     B ob = B("copy me");

Однако большинство компиляторов C ++ избегают таких накладных расходов, создавая временный объект и затем копируя его.

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.

Однако, если мы все еще хотим убедиться, что компилятор не исключает вызов конструктора копирования [отключить разрешение копирования], мы можем скомпилировать программу, используя опцию «-fno-elide-constructors» с g ++, и увидеть вывод следующим образом :

  aashish@aashish-ThinkPad-SL400:~$ g++ copy_elision.cpp -fno-elide-constructors
  aashish@aashish-ThinkPad-SL400:~$ ./a.out
  Constructor called
  Copy constructor called

Если используется опция -fno-elide-constructors, сначала вызывается конструктор по умолчанию для создания временного объекта, а затем вызывается конструктор копирования для копирования временного объекта в ob.

Ссылка:
http://en.wikipedia.org/wiki/Copy_elision

Эта статья составлена Aashish Barnwal и рецензирована командой GeeksforGeeks. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Скопируйте elision в C ++

0.00 (0%) 0 votes