复制省略(或省略复制)是一种编译器优化技术,可避免不必要的对象复制。如今,几乎每个编译器都使用它。让我们借助示例来理解它。
#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等的更多准备工作,请参阅“完整面试准备课程” 。