【发布时间】:2014-12-09 00:35:52
【问题描述】:
我正在观看来自 C++ And Beyond 2011 的 Scott Mayers、Herb Sutter 和 Andrei Alexandrescu 之间的一个老小组讨论。其中关于人们将获得哪些 c++11(当时的 c++0x)特性的问题错了,Andrei 提到人们假设从函数返回大值时移动语义不会涉及成本是错误的。这就是他所说的
我现在不会设计接口来按价值返回大的东西,因为 对于所有 r 值引用,有一个纯粹的原因 有很多情况会出现不必要的副本 创建的。这不应该被遗忘。
我不设计,也不容忍设计返回的界面 按价值计算的大事,因为有一天有人要从 它和分配将是低效的。
我认为不应该忘记退货的成本 r 值引用胜利的后果。
Herb 详细阐述了以下内容:
我同意你的观点,但它们是两种不同的情况,一种是你是 生成一个新的结果,你知道你将把它放在某个地方, 这就是您通过非 const 引用传入并输出的地方 参数,这就是 out 参数的用途。
在其他情况下,您有两个输入并且您将 做一些新的东西,它是按价值返回的,而不是相反 out 参数的东西,但它的返回值而不是做 今天容易出错的笨重解决方法,只是堆分配 返回一个指针,只是为了避免额外的副本。
这里发生了什么,我只是不明白这两个人的意思。 安德烈所说的“从它分配”的成本有什么区别? Herb 的解释也在我脑海中浮现。谁能详细说明一下?
还请考虑以下代码:
vector<BigData> GetVector(int someIndex)
{
vector<BigData> toFill;
// some processing
// filling the vector
return toFill;
}
我认为移动语义将使上述代码等效于将空向量作为输出参数传递。不是这样吗?
这是video 的链接。以上几点是在41分钟左右的播放时间后得出的。
【问题讨论】:
标签: c++ c++11 move-semantics rvalue-reference