首页 > 后端开发 > C++ > 移动赋值运算符中的'if (this != &rhs)”检查是否必要?

移动赋值运算符中的'if (this != &rhs)”检查是否必要?

DDD
发布: 2024-11-28 00:33:11
原创
210 人浏览过

Is the `if (this != &rhs)` Check Necessary in a Move Assignment Operator?

移动赋值运算符和 if (this != &rhs)

在类的标准复制赋值运算符中,通常的做法是检查分配的对象是否是与调用对象相同,使用 if (this != &rhs) 以避免更改调用对象。但是,这种检查对于移动赋值运算符来说是必要的吗?

移动语义

移动赋值运算符,由operator=(Class&&)表示,旨在有效地转移资源的所有权从一个物体到另一个物体。与副本分配不同,它避免了创建对象的新副本的需要。

情况分析

这个可以== &rhs吗?

问题出现了,在移动分配中 == &rhs 是否可以为真

对象绑定到右值引用有两种情况:

  1. 它是一个实际的临时对象。
  2. 它是调用者假装的一个对象是一个临时对象。

第一种情况,因为该对象是临时对象的唯一引用,这 == &rhs 是不可能的。在第二种情况下,调用者有责任确保 this != &rhs,从而使检查变得不必要。

不检查的论证

作者认为 if (this != &rhs) 检查是多余的,因为:

  • 临时变量的自分配是不可能。
  • 故意欺骗操作员的客户应该修复他们的代码。

通过省略此检查,可以在对象频繁从自身移出和分配给自己的情况下提高性能。

检查论证

然而,有些人认为 this != &rhs检查仍然是必要的,以防止自我移动分配。他们认为允许 swap(x, x) 作为有效操作可能会触发此检查。

解决方案和注意事项

作者得出的结论是:

复制并移动分配后置条件:

  • 复制赋值: y 的值应保持不变,包括自复制赋值的情况。
  • 移动赋值: y 应该具有有效但未指定的状态,包括 self -移动分配。

自移动分配实现:

为了实现这一点,提供了像 dumb_array 这样的类中移动赋值运算符的三种可能的实现:

1. 执行检查以区分self-move-assignment,之前对象被设置为有效状态

2. 忽略签入,使自移动分配成为无操作。

3. 交换(其他) ) 方法被使用,前提是该类不持有应立即释放的资源。

作者强调,最好的实现取决于具体的类设计、硬件特性和性能要求。

如果类不直接管理内存,建议使用operator=(Class& &) = 默认值;在基本异常安全的情况下实现最高性能。

以上是移动赋值运算符中的'if (this != &rhs)”检查是否必要?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板