说我有一个对象矢量
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;
}
答案 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,可以移动矢量并且它非常便宜,只需交换几个字