• 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

  • 相关阅读:
    python module introduce
    python代码基
    20100911部署更新
    汉王ocr
    wsgi
    css布局模板
    Making a simple web server in Python.
    20100910更新部署
    tw.forms usage
    python web shell
  • 原文地址:https://www.cnblogs.com/iloveyouforever/p/3442897.html
Copyright © 2020-2023  润新知