我有此方法:
vector<float> MyObject::getResults(int n = 1000)
{
vector<float> results(n, 0);
// do some stuff
return results;
}
当然,这不是经过优化的,我想返回该向量的引用,但是我不能简单地这样做:
const vector<float>& MyObject::getResults(int n = 1000)
{
vector<float> results(n, 0);
// do some stuff
return results;
}
这不起作用,向量将在方法结束时销毁,因为它是局部变量。
因此,我发现解决此问题的唯一方法是在MyObject中创建一个私有向量并返回对该向量的引用:
const vector<float>& MyObject::getResults(int n = 1000)
{
this->results.clear();
this->results.resize(n, 0);
// do some stuff
return results;
}
这是正确的方法吗?您还有其他解决方案可以提出吗?
什么是最有效的?在您的情况下,按值返回值[[is优化解决方案。 没有复制发生。
// This is best practice
vector<float> getResults(int n = 1000);
从函数未复制返回的局部变量。它们被移到将存储返回值的位置:这为什么?
// Result moved into v; no copying occurs
vector<float> v = getResults();
// Result moved into memory allocated by new; no copying occurs
vector<float>* q = new vector<float>(getResults());
当函数返回一个对象时,它以两种方式之一返回它:这是如何工作的?
int
和double
。对于在内存中返回的值,该函数将传递一个指针,该指针指向放置返回值所需的位置。 当您呼叫new vector<float>(getResults());
时,会发生以下情况:
getResults()
。 getResults
构造向量如何返回对局部变量的引用?
一般而言,这是过早的优化,它可能不会提供很多好处,或者没有任何好处,并且它可以使您的代码更复杂,更容易出现错误]]。 如果将getResults
的输出分配给矢量,则无论如何都会复制数据:MyObject m;
vector<float> = m.getResults(); // if getResults returns a const reference, the data gets copied
另一方面,如果将,因为getResults
的输出分配给const reference
,则这可能会使管理MyObject
的生存期变得更加复杂。在下面的示例中,返回的引用将在函数结束后立即失效
m
被破坏了。 vector<float> const& evilDoNotUseThisFunction() {
MyObject m;
vector<float> const& ref = m.getResults();
return ref; // This is a bug - ref is invalid when m gets destroyed
}
您应该为该向量分配内存,例如: