在类的标准复制赋值运算符中,通常的做法是检查分配的对象是否是与调用对象相同,使用 if (this != &rhs) 以避免更改调用对象。但是,这种检查对于移动赋值运算符来说是必要的吗?
移动赋值运算符,由operator=(Class&&)表示,旨在有效地转移资源的所有权从一个物体到另一个物体。与副本分配不同,它避免了创建对象的新副本的需要。
这个可以== &rhs吗?
问题出现了,在移动分配中 == &rhs 是否可以为真
对象绑定到右值引用有两种情况:
第一种情况,因为该对象是临时对象的唯一引用,这 == &rhs 是不可能的。在第二种情况下,调用者有责任确保 this != &rhs,从而使检查变得不必要。
作者认为 if (this != &rhs) 检查是多余的,因为:
通过省略此检查,可以在对象频繁从自身移出和分配给自己的情况下提高性能。
然而,有些人认为 this != &rhs检查仍然是必要的,以防止自我移动分配。他们认为允许 swap(x, x) 作为有效操作可能会触发此检查。
作者得出的结论是:
复制并移动分配后置条件:
自移动分配实现:
为了实现这一点,提供了像 dumb_array 这样的类中移动赋值运算符的三种可能的实现:
1. 执行检查以区分self-move-assignment,之前对象被设置为有效状态
2. 忽略签入,使自移动分配成为无操作。
3. 交换(其他) ) 方法被使用,前提是该类不持有应立即释放的资源。
作者强调,最好的实现取决于具体的类设计、硬件特性和性能要求。
如果类不直接管理内存,建议使用operator=(Class& &) = 默认值;在基本异常安全的情况下实现最高性能。
以上是移动赋值运算符中的'if (this != &rhs)”检查是否必要?的详细内容。更多信息请关注PHP中文网其他相关文章!