首先是什么 - 堆栈展开或复制返回值

nab*_*lke 16 c++

方法中使用的互斥锁是复制构造实例之前还是之后GetValues()发布的?dummy

class Protect
{};

class Test
{
public:
    Protect GetValues() const;

private:
    Protect m_protVal;
    Mutex m_mutex;
};

Protect Test::GetValues() const
{
    CLockGuard lock(m_mutex);

    return m_protVal;
}

int main(int argc, char** argv)
{
    Test myTestInstance;

    Protect dummy = myTestInstance.GetValues();
}
Run Code Online (Sandbox Code Playgroud)

让我们假设CLockGuard并且Mutex是boost lib提供的标准类.

Jam*_*nze 12

是:-).在形式上,返回值时有两个"副本":一个用于实际返回值的某个特殊位置,另一个返回后返回到最终放置值的位置.然而,可以优化其中之一或两者.局部变量的破坏发生在第一个之后,但在第二个之前.(NRVO和RVO可能导致第一个被优化,但它们不会影响您的代码,因为您没有返回局部变量.)