【问题标题】:Does passing a vector reference transfer ownership of its data?传递矢量引用是否会转移其数据的所有权?
【发布时间】:2014-11-12 17:02:03
【问题描述】:

传递和转移向量及其数据所有权的最佳方式是什么?

在理想的世界中,它会像这样工作:

std::vector<int>& SpitAVector(int input)
{
    std::vector<int> result;
    result.push_back(input);
    return result;
}

int main()
{
    std::vector<int> myvec;
    myvec = SpitAVector(60);

    std::cout << (int)myvec[0] << std::endl;  //Outputs 60      
}

这不起作用,因为我返回的是对局部变量的引用。

是否可以使用boost::unique_ptrboost::shared_ptr 来处理这个向量输出? (不能使用 C++11 的 unique_ptr!)

【问题讨论】:

  • 为什么不直接按值返回呢?任何体面的优化编译器都会将副本优化为移动。
  • 任何符合 C++11 的编译器最多只能做一个动作。任何体面的优化编译器都会完全忽略复制/移动。
  • @TheParamagneticCroissant 实际上,RVO 将简单地构造将返回的向量,因此任何现代编译器都不会移动。
  • @cdhowie 是的,还有一个按值返回的原因。

标签: c++ rvo


【解决方案1】:

传递和转移向量及其数据所有权的最佳方式是什么?

按值返回向量。

在 C++11 或更高版本中,返回值将被移动(如果需要),因此肯定不会有批量数据副本。

如果您停留在过去,那么请确保您满足返回值的复制省略条件。你的函数,只有一个返回点,可以。尽管不是必需的,但任何体面的编译器都会执行该优化。

是否可以使用 boost::unique_ptr 或 boost::shared_ptr 来处理这个向量输出?

是的,但这会不必要地复杂。只需按值返回。

【讨论】:

  • 这个向量应该包含大约 260 MB 的数据。我假设按值返回不会导致复制
  • @Daniel:如果您使用的是 C++11(带有移动语义),或者只有一个返回点(就像您在此处所做的那样),则不会。我只是写一些关于它的细节。
  • @Daniel 现在大多数编译器都实现了返回值优化(RVO),这将导致向量在调用函数的堆栈空间中被构造,它会被返回到 - 不会是复制构造,甚至不是移动构造。
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多