如何有效地返回大型数据结构。

时间:2016-07-17 21:11:54

标签: c++ memory-management vector

说我有一个对象矢量

std::vector<int> data; 

此向量将非常大(大小为兆字节)。我有一个需要返回此数据结构的函数。如果我返回这个数据结构“by-value”将会产生一个向量的副本吗?

std::vector<int> generate()
{
    std::vector<int> data;
    //Populate data
    return data;
}

将此操作与在堆上分配向量并将指针传递给向量的效率相比如何?

std::vector<int>* generate()
{
    std::vector<int>* data = new std::vector<int>();
    //Populate data
    return data; 
} 

4 个答案:

答案 0 :(得分:5)

在您的特定情况下,大多数编译器将执行NRVO - 命名返回值优化。这意味着不会复制任何数据,但无法保证。有些情况下不会使用NRVO。在C ++ 11及更高版本中,向量可能仍然使用移动语义,这将是非常有效的。

[编辑]

要澄清一下,如果你使用C ++ 11兼容的编译器,那么你的代码是有效的,如果你坚持使用C ++ 03然后更安全更好地返回函数参数(通过引用),就像在某些情况下你可能以复制结束。

答案 1 :(得分:4)

现代编译器知道如何将其优化为简单的移动。你的第一个例子足够有效;你不需要做任何其他事情。

答案 2 :(得分:0)

如果您的代码结构允许,您最初可以传递一个空的std::vector,然后通过引用返回,如下所示:

std::vector<int>& generate(std::vector<int>& _vec) {
    // populate _vec
    return _vec;
}

这样就不必使用指针或创建副本。

答案 3 :(得分:0)

如果使用c ++ 11,可以移动矢量并且它非常便宜,只需交换几个字