如何在方法主体中返回已声明向量的引用?

问题描述 投票:0回答:2

我有此方法:

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;
}

这是正确的方法吗?您还有其他解决方案可以提出吗?

c++ pointers reference pass-by-reference
2个回答
0
投票

什么是最有效的?在您的情况下,按值返回值[[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());

这是如何工作的?

当函数返回一个对象时,它以两种方式之一返回它:
    在寄存器中
  • 内存中
  • 您只能在寄存器中返回简单对象,例如intdouble。对于在内存中返回的值,该函数将传递一个指针,该指针指向放置返回值所需的位置。

    当您呼叫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 }

    -1
    投票
    您应该为该向量分配内存,例如:
    © www.soinside.com 2019 - 2024. All rights reserved.