📜  在C++中复制省略

📅  最后修改于: 2021-05-26 02:15:27             🧑  作者: Mango

复制省略(或省略复制)是一种编译器优化技术,可避免不必要的对象复制。如今,几乎每个编译器都使用它。让我们借助一个示例来理解它。

#include 
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;
}

上面程序的输出是:

Constructor called

为什么不调用拷贝构造函数?
根据理论,在构造对象“ ob”时,将使用一个参数构造函数将“复制我”转换为临时对象,并将该临时对象复制到对象“ 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.

但是,如果我们仍然要确保编译器不会忽略对复制构造函数的调用[禁用复制省略],则可以在g ++中使用“ -fno-elide-constructors”选项来编译程序,并看到以下输出:

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”选项,则首先调用默认的构造函数以创建一个临时对象,然后调用copy构造函数以将该临时对象复制到ob。

参考:
http://en.wikipedia.org/wiki/Copy_elision

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”