【问题标题】:Rvalue reference右值参考
【发布时间】:2010-09-02 03:52:51
【问题描述】:

在尝试理解来自 here 的右值引用时,我无法理解两件事

  1. 如果向量中有 N 个字符串,每个副本可能需要 多达 N+1 个内存分配和 [...]

'N+1' 中的 +1 是什么?

2.作者是如何突然得出下面的指导方针的

准则:不要复制你的函数 论据。相反,按值传递它们 并让编译器进行复制。

我错过了什么吗?

【问题讨论】:

    标签: c++ reference rvalue-reference


    【解决方案1】:

    'N+1' 中的 +1 是什么?

    一次分配为新向量创建底层数组,然后是 N 次分配,为向量中的 N 个字符串中的每一个分配一次。

    作者是如何突然得出下面的指导方针的

    他认为不是明确在函数内部制作副本,

    std::vector<std::string> 
    sorted2(std::vector<std::string> const& names) // names passed by reference
    {
        std::vector<std::string> r(names);         // and explicitly copied
        std::sort(r);
        return r;
    }
    

    当你将参数传递给函数时,你应该让编译器制作副本,

    std::vector<std::string> 
    sorted2(std::vector<std::string> names)        // names passed by value
    {                                              // and implicitly copied
        std::sort(names);
        return names;
    }
    

    【讨论】:

    • 哦。优点是当使用“按值调用”语义时,存在复制省略的可能性,而在使用“按引用调用”语义的情况下则不存在。对吗?
    • 迈耶斯也指出了这一点——当我们应该让编译器为我们完成复制时,我们最终手动复制的频率。
    • @dirkgently:有没有提到 Scott 的文章?
    • Effective C++,第 19 条:理解临时对象的由来。
    • 问题是,这实际上并没有给你买任何东西,因为你失去了 RVO——在第二个版本中,你最终制作了一个向量的副本以从 sorted2 返回它,而在第一个版本中,编译器可以使用 RVO 在将要返回的位置直接构造 r。所以这两个版本最终都会在不同的地方制作不需要的副本。现在使用 C++11,您可以通过使用显式移动并返回带有 return std::move(names) 的右值引用 (std::vector&lt;std::string&gt; &amp;&amp;) 来降低第二种情况下的复制成本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-23
    • 2021-11-04
    相关资源
    最近更新 更多