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

ora*_*ice 0 c++ memory-management vector

说我有一个对象矢量

std::vector<int> data; 
Run Code Online (Sandbox Code Playgroud)

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

std::vector<int> generate()
{
    std::vector<int> data;
    //Populate data
    return data;
}
Run Code Online (Sandbox Code Playgroud)

将此操作与在堆上分配向量并将指针传递给向量相比,效率有多高?

std::vector<int>* generate()
{
    std::vector<int>* data = new std::vector<int>();
    //Populate data
    return data; 
} 
Run Code Online (Sandbox Code Playgroud)

Dút*_*has 5

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


mar*_*inj 5

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

[编辑]

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