此代码:C++返回值优化
#include <vector>
std::vector<float> getstdvec() {
std::vector<float> v(4);
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
return v;
}
int main() {
std::vector<float> v(4);
for (int i = 0; i != 1000; ++i)
{
v = getstdvec();
}
}
我这里不正确的理解是,该功能getstdvec不应该有实际分配,它的返回向量。当我在valgrind/callgrind中运行它时,我发现有1001个malloc调用; 1用于main中的初始向量声明,每个循环迭代1000次。
什么给?我怎样才能从这样的函数中返回一个矢量(或任何其他对象),而不必每次都分配它?
编辑:我知道我可以通过引用传递向量。我的印象是,有可能(甚至最好)编写这样的函数,返回一个对象而不会产生不必要的分配。
对于您的编辑:我们需要一个您正试图解决的问题的实例,而不是这个极其微小的示例代码,以帮助提供非通过参考的解决方案。 –
@MarkB,它的确如此简单:我想要一个返回矢量而不必进行不必要的复制/分配的函数。我的印象是,与RVO或rvalues有关的东西会使这件事情变得非常简单。一个简单的现实世界的例子就是尝试对向量y和x以及标量k做y = k * x。传统的传递参考函数看起来像'void mult(const float&k,const vec&x,vec&y)'。但显然函数调用'y = mult(k,x)'比'mult(k,x,y)'更可取。 – Aurelius
RVO(返回值优化)是编译器对您的代码执行的操作。你的代码需要首先做一些可以优化的东西(例如传递一个临时的东西,例如分配给同一个对象)。你可能已经看过那个代码并且认为 - 嗯,我可以通过传递一个对getstdvec的引用来优化它。为什么编译器不这样做?那么,传递参考并不代表你的代码。你只能期望编译器优化你的代码所做的事情 - 而不是它可以做的事情。 – iheanyi