Copy elision in C++

 

  Copy elision (or Copy omission) is a compiler optimization technique that avoids unnecessary copying of objects. Now a days, almost every compiler uses it.

  Let us understand it with the help of an example.

 1 #include <iostream>
 2 using namespace std;
 3   
 4 class B
 5 {
 6 public:    
 7     B(const char* str = "") //default constructor
 8     {
 9         cout << "Constructor called" << endl;
10     }    
11      
12     B(const B &b)  //copy constructor
13     {
14         cout << "Copy constructor called" << endl;
15     } 
16 };
17   
18 int main()
19 { 
20     B ob = "copy me"; 
21     return 0;
22 }

  The output of above program is: Constructor called
  

  Why copy constructor is not called?
  According to theory, when the object “ob” is being constructed, one argument constructor is used to convert “copy me” to a temporary object & that temporary object is copied to the object “ob”.

  So the statement

     B ob = "copy me";
  should be broken down by the compiler as

     B ob = B("copy me");
  

  However, most of the C++ compilers avoid such overheads of creating a temporary object & then copying it.

  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.
  

  However, if we still want to ensure that the compiler doesn’t elide the call to copy constructor [disable the copy elision], we can compile the program using “-fno-elide-constructors” option with g++ and see the output as following:

     root:~$ g++ copy_elision.cpp -fno-elide-constructors
     root:~$ ./a.out
    Constructor called
    Copy constructor called
  If “-fno-elide-constructors” option is used, first default constructor is called to create a temporary object, then copy constructor is called to copy the temporary object to ob.

 

  Reference: http://en.wikipedia.org/wiki/Copy_elision

 

  Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
    

  转载请注明:http://www.cnblogs.com/iloveyouforever/

  2013-11-26  11:13:29

原文地址:https://www.cnblogs.com/iloveyouforever/p/3442897.html