C++中的复制删除

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

null

#include <iostream>
using namespace std;
class B
{
public :
B( const char * str = " " ) //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”时,使用一个参数构造函数将“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.

但是,如果我们仍然希望确保编译器不省略对复制构造函数的调用[禁用复制省略],我们可以使用带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”选项,则调用第一个默认构造函数来创建临时对象,然后调用复制构造函数将临时对象复制到ob。

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

本文由 阿希什·巴恩瓦尔 并由Geeksforgeks团队审核。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享