所以我一直在 SO 和其他地方阅读关于std::move
, std::forward
, rvalues, lvalues ad 等等。但我发现我无法掌握它。尽管我有时会进行修复,但我想我了解在这之前 C++ 中有关指针、引用等的基本知识。是我还是这些东西太重了?
问问题
550 次
2 回答
7
如果您还没有,我建议您阅读原始提案:
它非常清楚地列出了可以用右值引用和移动语义解决的问题,以及如何使用右值引用和移动语义来解决这些问题。
标准委员会的文件通常很密集且难以理解,但这篇很容易理解并且非常值得一读。最终 C++0x 标准中指定的右值引用和移动语义(无论何时发生)可能与本文中提出的不同,但概念仍然相同。
于 2010-11-12T02:17:16.037 回答
1
你的问题很笼统。也许我可以让你开始:
- 忽略函数
std:move()
和std::forward()
开头 - RValue 引用的一个方面是保存临时对象。
- 在 C++03 代码中,计算
Matrix z = a + b + c + d;
(withMatrix a,b,c,d;
)的时间 - 使用重载的RValue References实现自己
operator+
。Matrix
- 您应该能够大大减少临时人员的数量。
- 在 C++03 代码中,计算
如果您想查看 的简单用法std::move()
:帮助编译器避免为返回值引入副本:
- 制作一个容器类
Image
——复制成本高。 - 不要忘记实施移动和复制分配
发明一个像这样工作的工厂函数:
图片 load_matching_size(const char *fn_small, const char *fn_big) { 对<图像> ii = load_2_images(fn_small, fn_big); 返回 ii.first.width() >= 64 ?ii.first : ii.second ; }
你能数出临时工的数量吗?请注意,这
return
将需要一个额外的和副本!(该示例设计为不可能进行返回值优化(“RVO”))- 你能看出这是没有必要的吗?函数返回后不久,其中的图像
ii
将被丢弃。编译器可以使用 then 作为返回值吗?(不,它不能。如果我们只有一个 RVO 就可以工作Image
)。 - 使用
move
inreturn
你可以告诉编译器,你不需要ii
进一步,它可以使用它来返回。因此,使用move-c'tor而不是copy-c'tor可以节省成本高昂的副本作为回报。
于 2010-11-14T16:21:05.200 回答