【问题标题】:Am I the only one who finds std::move a little too difficult to understand?我是唯一一个觉得 std::move 有点难以理解的人吗?
【发布时间】:2010-11-12 02:06:33
【问题描述】:

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

【问题讨论】:

  • 幸运的是,在它们标准化之前,您还有大约 10 年的时间来尝试理解它们。
  • 你不能准确掌握什么?诚然,右值一开始可能有点令人困惑,但其他的非常简单。当然,如果需要,您可以直接使用指针和引用,但它们可能会被滥用和误用,从而导致有时难以诊断的问题。标准库旨在通过允许更多的编译时验证来帮助您编写更安全、正确的代码,否则您可能没有。
  • @Travis:不是这样。 C++0x 应该在明年标准化,一些编译器实现已经支持它们(即 Visual C++ 和 g++,尽管其他可能也已经支持它们)。
  • @James:你的乐观让人心旷神怡。不过,更严重的是,如果您处于只需要使用现代编译器的绝佳位置,请立即学习这些东西!

标签: c++ c++11 move-semantics


【解决方案1】:

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

A Proposal to Add Move Semantics Support to the C++ Language

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

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

【讨论】:

  • 不,我还没有读过那篇文章,原因与您所说的完全相同。我发现官方文档太难筛选了。这就是为什么像这样的网站如此出色的原因。但我会试一试:(。
  • @nakiya:如有任何问题,请随时在此处发帖(如果您认为该论文没有帮助,请在评论中诅咒我)。这篇论文是技术性的,但从足够高的水平来看,它是可读的。
【解决方案2】:

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

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

如果你想看std::move()的简单用法:帮助编译器避免为返回值引入副本:

  • 制作像Image 这样的容器类——复制成本很高。
  • 不要忘记实现 movecopy-assign
  • 发明一个像这样工作的工厂函数:

    图片 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 将需要一个额外的并复制! (该示例的设计使得 return-value-optimization(“RVO”)应该是不可能的)

  • 您能看出这不是必需的吗? ii 中的图像将在函数返回后不久被丢弃。编译器可以使用 then 作为返回值吗? (不,它不能。如果我们只有一个 Image,RVO 就可以工作)。
  • 使用return 中的move,您可以告诉编译器,您不再需要ii,它可以将其用于返回。因此,我使用 move-c'tor 而不是 copy-c'tor 来节省成本高昂的副本作为回报。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-09
    • 2014-03-28
    • 2017-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    相关资源
    最近更新 更多