返回锁时C++11移动
C++11 move when returning a lock
在《C++并发操作》一书中,阅读以下方法
std::unique_lock<std::mutex> wait_for_data()
{
std::unique_lock<std::mutex> head_lock(head_mutex);
data_cond.wait(head_lock,[&]{return head.get()!=get_tail();});
return std::move(head_lock);
}
我不明白为什么返回时head_lock是std::move-ed。我对移动用法和RVO的概念和直觉与C++11右值和移动语义混淆(返回语句)中的观点一致
但我有点倾向于相信作者会知道得更好。有人能澄清一下什么时候std::move返回值更好吗?锁有什么特别的地方吗?谢谢
无论有没有std::move
都可以。局部变量*的名称在return
语句中被视为右值,导致在这两种情况下都调用move构造函数。作者使用std::move
大概是出于风格上的原因,以表明锁正在被移动。它确实会干扰NRVO,但与锁定和等待的成本相比,在这里移动unique_lock
的成本可能是最小的。
用@Deduplior的话来说,这是"为了强调实际语义而进行的一种讨厌化"。
你可以自己测试——unique_lock
不能被复制,所以如果它是一个副本,return head_lock;
就不会编译。
*这是C++14规则。C++11规则仅限于允许或将允许复制省略的情况,除非变量是函数参数。就这个问题而言,这种差异是无关紧要的,因为head_lock
显然符合副本省略的条件
相关文章:
- 在 C++11 中移动语义
- 是否可以通过使用移动/交换 c++11 来延长返回的临时变量的生命周期
- 移动构造函数 C++11
- 如果没有带有函数签名的 rvalue 参数,是否会执行 C++ 11 中的移动语义?
- 从从可调用参数创建的线程对象参数移动构造 C++11 线程
- C 11多移动构造函数调用
- C 11移动无效
- C++11 在列表到映射(或其他容器)之间移动元素
- C 11是否保证将移动垂死的对象而不是复制为参数
- C++11 是否保证 return 语句中的局部变量将被移动而不是复制?
- DirectX 11 基于旋转移动对象
- C 11 STL容器支持仅移动类型,并且具有O(1)写入访问的开始和结束
- C 11力无条件地移动
- C 11构造函数参数:std ::移动和值或std :: forward and rvalue参考
- C 11移动语义
- C 11:没有触发移动构造器
- C 11移动构造函数未调用,默认构造函数首选
- 如何使用C 11移动语义以明确避免复制
- 在 c++11 中,虚函数能否通过移动语义有效地返回大值
- 除了移动语义,还有哪些C++11特性可以提高代码的性能