c++ - 传递重物 C++0x

标签 c++ c++11 move-semantics copy-elision

我有一个函数可以生成一种昂贵的对象(包含 vector 和非固定大小的 map ),所以我真的想避免调用复制 c'tors。

到目前为止,我只是从方法中返回了一个 std::shared_ptr 并使用了它,但我认为它很丑陋并且需要类型定义才能真正使用。

我知道有两件事可能对我有帮助。一是复制省略,二是 move 语义。

我的问题是我不知道如何正确使用它们。我的研究告诉我,复制省略完全由编译器完成,而不是 st'd 的一部分。我真的不想完全依赖这个。

那么我如何确保调用 move 赋值并将其放置到位以防止编译器执行复制省略。

ResultSet &&generateResults()
{
    //ResultSet a(); :S
    ResultSet a;
    a.populat(...
    //blah blah blah
    return a;
}

//else where (where the && assignment operator is overloaded
ResultsSet b = generateResults();

在这种情况下,这是最正确的编码方式吗?如果不是,我该如何改进它。我很高兴仅使用 C++0x 构造。

顺便说一句:我的编译器是 gcc 4.6

最佳答案

您可以在 Dave Abrahams 的博客文章系列中找到对您问题的一个很好的答案:

http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

它涵盖了右值引用、 move 构造函数和复制省略之间的交互。有点长,但值得一读:)

简而言之,复制省略具有优先权。如果由于某种原因它没有(或不能)发生,编译器必须首先考虑 move 构造函数,最后考虑复制构造函数。

关于c++ - 传递重物 C++0x,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397278/

相关文章:

C++11线程id,有更简单的命名约定吗?

c++ - 接收参数并为可能失败的函数 move 语义(强大的异常安全性)

c++ - OpenCV 3 中的 PCA 错误

c++ - 在 C++ 下的 OpenCV 中提取 RGB channel

c++ - 内联函数和复制构造函数

c++ - 这是什么 C++ C11 语法 : "= {}"?

c++ - 右值引用绑定(bind)到 std::function 类型的左值

c++ - 我可以使用转换将构造(或分配) move 到不同类型值的 map 吗?

c++ - 为什么结构类型的数组不能正常工作?

c++ - 如何转换模板类?