返回时如何避免复制

How to avoid the copy when I return

本文关键字:复制 何避免 返回      更新时间:2023-10-16

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

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

在这种情况下,我在函数foo()中创建一个临时内存空间,然后通过复制将其分配给CCD_ 1。我真的想避免这个副本,任何简单的方法能在C++11中做到这一点吗?我认为这与右价有关。

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

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?
  }
}

THanks!!!

Modem C++编译器将实现:给定类型T:

  • 如果T有一个可访问的复制或移动构造函数,编译器可以选择取消复制。这就是所谓的(命名的)返回值优化(RVO),它甚至在C++11之前就已经指定大多数编译器都支持
  • 否则,如果T有一个move构造函数,则T被移动(由于C++11
  • 否则,如果T有一个复制构造函数,则T被复制
  • 否则,将发出编译时错误

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

原则上,您也可以在函数之外创建对象,然后调用函数并通过引用将对象传递给它。这将是避免复制的旧方法,但现在没有必要,也不可取。

我通常通过将函数签名作为来解决这个问题

void foo(set<int> *x)

只需通过引用传递它,或者注释中已经提到了其他选项。

编辑:我已经更改了参数类型,以说明x可以更改。

      set<int> s;
      foo(&s);

只有当你有一个旧的编译器时,这才是首选。我想有些项目可能就是这样。

而且,更好的做法是在c++11中使用move语义。或者继续返回容器并查看现代编译器中的RVO。