我是唯一一个发现std :: move有点难以理解的人吗?

nak*_*iya 5 c++ move-semantics c++11

因此,我一直在阅读关于std::move,std::forwardrvalues,左值等广告在SO和其他地方.但我发现我无法掌握它.即使我有时会进行修复,但我认为我理解了关于指针,引用等的基本内容,这些都是在C++之前的所有内容.是我还是这些东西太重了?

Jam*_*lis 7

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

一项为C++语言添加移动语义支持的建议

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

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


tow*_*owi 1

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

  • 忽略开头的函数std:move()std::forward()
  • RValue 引用的一方面是保存临时值。
    • Matrix z = a + b + c + d;在 C++03 代码中,计算(with Matrix a,b,c,d;)的临时数
    • 使用重载的RValue Referencesoperator+来实现自己。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.第一:ii.第二;
    }
    
  • 你能数一下临时工的数量吗?请注意,return需要额外一份并复印!(该示例的设计使得返回值优化(“RVO”)不应该成为可能)

  • 你能看出这是没有必要的吗?函数返回后不久,其中的图像ii将被丢弃。编译器可以使用 then 作为返回值吗?(不,不可能。如果我们只有一个,RVO 就可以工作Image)。
  • 通过movein ,return您可以告诉编译器您不需要ii进一步的操作,并且它可以将其用于返回。因此,我可以使用move-c'tor而不是copy-c'tor进行返回,从而节省昂贵的副本。