August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
如果一个vector有很多元素,那么拷贝的代价会很高。因此,我们只应在必要时才拷贝vector。考虑下面这个例子:
在本例中,我们从输入流读取数据存入res,然后将它返回给use()。将res从fill()拷贝出来并拷贝到vec中,代价可能很高。但为什么要拷贝呢?我们不需要拷贝!在从函数返回后,我们不可能再使用原对象了(res)。实际上,res会被销毁,这是fill()返回过程的一部分。那么我们如何避免拷贝呢?让我们再次考察一个向量在内存中的表示:
我们希望能“偷出”res的表示用于vec。换句话说,我们希望vec指向res的元素,而不进行任何拷贝。
在将res的元素指针和元素数量移动到vec后,vec就持有了元素,我们就成功地完成了将res中的元素值移出fill()并移到vec中的工作。现在,res可以被(简单且高效地)销毁,没有任何不良副作用:
我们成功地将100000个double移出fill()并移到它的调用者中,而代价仅仅是四个机器字的赋值。
我们如何用C++代码表达这种移动?我们可以定义移动操作,作为拷贝操作的补充: ...