我回来时如何避免复制

Wha*_*rld 8 c++ rvalue-reference c++11

我有一个返回向量或集合的函数:

set<int> foo() {
    set<int> bar;
    // create and massage bar
    return bar;
}

set<int> afoo = foo();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在函数foo()中创建一个临时内存空间,然后afoo通过复制将其分配给它.我真的想避免这个副本,我可以用C++ 11做到这一点吗?我认为这与rvalue有关.

好的,更新问题:如果我要返回自己定义的对象,而不是向量或设置的东西,这是否意味着我应该定义一个移动构造函数?像这样:

class value_to_return {
  value_to_return (value_to_return && other) {
    // how to write it here? I think std::move is supposed to be used?
  }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!!!

bil*_*llz 18

调制解调器C++编译器将实现:给定一个类型T:

  • 如果T具有可访问的副本或移动构造函数,则编译器可以选择忽略该副本.这就是所谓的(命名)返回值优化(RVO),它甚至在C++ 11之前就被指定并且得到了大多数编译器的支持.
  • 否则,如果T有一个移动构造函数,则移动T(自C++ 11起).
  • 否则,如果T具有复制构造函数,则复制T.
  • 否则,将发出编译时错误.


DUm*_*man 5

检查返回值优化.现代编译器将优化这种情况,在这些简单的情况下,不会在任何主要编译器上进行复制.

原则上,您还可以在函数外部创建对象,然后调用该函数并通过引用将对象传递给它.这将是避免复制的旧方法,但现在这是不必要的和不受欢迎的.