通过矢量引用是否转移了其数据的所有权?

Dan*_*iel 0 c++ rvo

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

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

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      
}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我正在返回对局部变量的引用.

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

Mik*_*our 5

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

按值返回向量.

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

如果您遇到过去,请确保您符合返回值的复制省略标准.你的功能只有一个返回点.虽然不是必需的,但任何体面的编译器都会执行该优化.

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

是的,但这会不必要地复杂化.只是按价值回报.

  • @Daniel如今,大多数编译器都实现了返回值优化(RVO),这将导致向量在将要返回的调用函数的堆栈空间中进行构造-甚至不会进行复制构造。移动构造。 (2认同)