2015-11-02 172 views
3

我有一堆方法返回vector<int>。它们不返回参考或指向vector<int>的指针,因为返回的值不是类的状态的一部分,它只是根据方法参数即时生成。避免向量拷贝构造函数

我想避免vector<int>当我调用像这样的方法时调用拷贝构造函数。

vector<int> result = myClass.GenerateVectorOfInt(/* params */); 

// Do something with the result; 

这样做的最佳方法是什么?

这会是一个可以接受的方式吗?或者还有其他更好或更优雅的解决方案。

vector<int> result = std::move(myClass.GenerateVectorOfInt(/* params */)); 
+1

你有[验证](http://coliru.stacked-crooked.com/a/4fe331ecaf9498e7)复制构造函数实际上被调用? – chris

+0

未发布问题。我已经在向量的拷贝构造函数中放置了一个断点,并且没有被击中。 – mk33

回答

6

你不需要做任何特殊的事情,编译器可以在可行的情况下删除副本。这称为“返回值优化”(RVO)。

即使RVO没有发生,C++ 11也会迫使vector移动到位,这很便宜,与其大小无关。 (通常这是1个指针和2个整数赋值。)所以矢量绝不会被复制,此举是最糟糕的情况。


如果出于任何原因RVO不会发生此举是为你的用例(可能性很小)太贵了,还有什么是你可以在不改变功能的签名做;在呼叫点加入std::move或类似的东西将无济于事。