我有一个关于使用boost::lock_guard
(或类似的范围锁)并使用return
语句中应该受锁保护的变量的问题。
如何销毁本地对象并复制返回值?返回值优化如何影响这个?
示例:
Data Class::GetData()
{
boost::lock_guard<boost::mutex> lock(this->mMutex);
return this->mData;
}
这是否正确(如果mData是受mMutex保护的变量)?或者我是否必须使用本地范围和临时,如下例所示:
Data Class::GetData()
{
Data ret;
{
boost::lock_guard<boost::mutex> lock(this->mMutex);
ret = this->mData;
}
return ret;
}
答案 0 :(得分:23)
如第一个例子中那样直接回归是正确的。返回值是在销毁局部变量之前构造的,因此在锁定被释放之前构建。
答案 1 :(得分:3)
如何销毁本地对象并复制返回值?
通常,堆栈对象会以创建的相反顺序销毁。如前所述,您指定的两种方法都将提供所需的行为。
返回值优化如何影响这个?
这里不应该关注RVO - 所有这一切都是将输出对象直接构造到堆栈帧缓冲区中 - 避免了创建命名临时对象的开销(如上面的第2个示例所示)。这是在调用本地析构函数之前完成的。
您最好使用上面示例1中的代码。
答案 2 :(得分:0)
两件都是等价的。事实上,对于案例#1 - C ++编译器将创建在案例#2中描述的结构。所以#1更可取。