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