为什么使用 swap 来实现复制分配
Why using swap to implement copy assignment?
在这里: http://en.m.wikipedia.org/wiki/Rule_of_three_(C++_programming)
/** Copy Assignment Operator */
Foo& operator= (const Foo& other) {
Foo temporary (other);
std::swap (data, temporary.data);
return *this;
}
在此示例中,它使用 std::swap
与临时交换数据。我们为什么要创建一个临时和交换?只是复制不是更快吗?我在其他地方也看到了这一点,感到困惑。
交换技巧是确保异常安全的一种相当简单的方法。
如果您逐个字段复制,并在中间出现异常,则您的对象最终可能会处于不一致状态(除非您采取措施解决此问题,这可能会使事情变得相当复杂)。
使用基于 swap 的实现,如果抛出Foo temporary (other)
,则对象将保持其原始状态不变。
此外,要启用复制省略和 (c++11) 移动语义,请执行以下操作:
Foo& operator= (Foo other) {
std::swap(data, other.data);
return *this;
}
这是为了避免不一致的状态,或者用更好的词来说,我们会说是使异常安全。
你也可以检查这个相关的线程:- 什么是复制和交换成语?
正如GManNickG在上面的帖子中提到的:-
它通过使用复制构造函数的功能来创建 数据的本地副本,然后通过交换获取复制的数据 函数,将旧数据与新数据交换。临时副本 然后销毁,带走旧数据。我们留下了一份副本 的新数据。
为了使用复制和交换成语,我们需要三件事:一个 工作复制构造函数,工作析构函数(两者都是 任何包装器,所以无论如何都应该是完整的),以及一个交换函数。
交换函数是一个非抛出函数,它交换 类,成员对成员。我们可能会想使用 std::swap 代替 提供我们自己的,但这是不可能的;std::swap 使用 其中的复制构造函数和复制赋值运算符 实现,我们最终会尝试定义任务 就自身而言!
另请查看为什么有些人使用交换进行移动分配?
- 为共享 ptr 向量实现复制 c'tor?
- 使用共享指针实现复制 c'tor?
- 如何在双向链表上实现复制赋值?
- 实现不可复制的C++类
- 在C++中正确实现复制构造函数
- 如何在模板容器类中实现复制构造函数和赋值运算符
- 在单个链接列表中实现复制构造函数C
- 如何为具有自引用指针的类实现复制构造函数/赋值运算符
- 为什么完美的转发(全部捕获)不能实现复制分配?
- 在 C++11 中实现复制和交换习语的更好方法
- 如何为派生类实现复制构造函数
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- C++实现复制构造函数
- 为什么使用 swap 来实现复制分配
- 使用桥接模式 c++ 实现复制构造函数
- PFArrayD.cpp实现复制构造函数
- 为简单向量实现复制构造函数
- 实现复制构造函数
- 矢量实现复制构造函数错误
- 根据move构造函数实现复制赋值操作符