5

所以我一直在 SO 和其他地方阅读关于std::move, std::forward, rvalues, lvalues ad 等等。但我发现我无法掌握它。尽管我有时会进行修复,但我想我了解在这之前 C++ 中有关指针、引用等的基本知识。是我还是这些东西太重了?

4

2 回答 2

7

如果您还没有,我建议您阅读原始提案:

向 C++ 语言添加移动语义支持的建议

它非常清楚地列出了可以用右值引用和移动语义解决的问题,以及如何使用右值引用和移动语义来解决这些问题。

标准委员会的文件通常很密集且难以理解,但这篇很容易理解并且非常值得一读。最终 C++0x 标准中指定的右值引用和移动语义(无论何时发生)可能与本文中提出的不同,但概念仍然相同。

于 2010-11-12T02:17:16.037 回答
1

你的问题很笼统。也许我可以让你开始:

  • 忽略函数std:move()std::forward()开头
  • RValue 引用的一个方面是保存临时对象。
    • 在 C++03 代码中,计算Matrix z = a + b + c + d;(with Matrix a,b,c,d;)的时间
    • 使用重载的RValue References实现自己operator+Matrix
    • 您应该能够大大减少临时人员的数量。

如果您想查看 的简单用法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)。
  • 使用moveinreturn你可以告诉编译器,你不需要ii进一步,它可以使用它来返回。因此,使用move-c'tor而不是copy-c'tor可以节省成本高昂的副本作为回报。
于 2010-11-14T16:21:05.200 回答