August 2021
Intermediate to advanced
450 pages
5h 35m
Chinese
我们可以通过定义拷贝构造函数和拷贝赋值运算符来控制拷贝,但是对于大型容器来说拷贝的代价可能太高。当使用引用向函数传递对象时,可避免拷贝的代价,但我们不能返回局部对象的引用作为结果(在调用者有机会查看一下返回的局部对象之前,它就已经被销毁了)。考虑下面代码:
为了从运算符+返回结果,要将结果从局部变量res拷贝出来,拷贝到调用者可以访问的地方。我们可能这样使用+:
这就需要拷贝Vector对象至少两次(每次使用运算符+都要拷贝一次)。如果Vector很大,比方说含有10000个double,那么这种拷贝就会让人头疼不已了。最不合理的地方是operator+()中的res在拷贝后就不再使用了。事实上我们并不想要一个副本——我们只想把计算结果从函数中取出来——我们想要的是移动(move)一个Vector,而不是拷贝(copy)它。幸运的是,我们可以表达这一意图:
基于上述定义,编译器将选择移动构造函数(move constructor)来实现将返回值从函数中传输出来的任务。这意味着r=x+y+z不需要再拷贝Vector,而只是移动它。 ...
Read now
Unlock full access