C++11中自定义swap方法的可行性及适用场景探讨
关于C++11中自定义swap方法的思考
在C++11引入移动语义之后,多数场景下我们其实不需要手动实现swap方法,但也存在必须自定义的例外情况。我梳理了一下,只有两种场景下需要我们手动提供自定义swap:
- 类型未提供移动语义(更准确地说,是未提供移动赋值运算符——实际开发里常遇到类有移动构造函数,但偏偏缺失移动赋值的情况);
- 类的移动构造函数和/或移动赋值运算符存在不期望的副作用,而swap操作不需要触发这些额外逻辑。
给大家举个实际场景的例子:
class remote_connection { private: // 管理远程连接的句柄 int conn_handle = -1; public: remote_connection() = default; explicit remote_connection(int handle) : conn_handle(handle) {} // 移动赋值运算符带有额外的远程通知逻辑,这是swap不需要的 remote_connection& operator=(remote_connection&& other) noexcept { if (this != &other) { if (conn_handle != -1) { close_connection(conn_handle); notify_remote_disconnect(conn_handle); // 通知远程端断开,swap时没必要执行这个 } conn_handle = other.conn_handle; other.conn_handle = -1; } return *this; } // 自定义swap,绕过移动赋值的额外逻辑 friend void swap(remote_connection& lhs, remote_connection& rhs) noexcept { using std::swap; swap(lhs.conn_handle, rhs.conn_handle); // 仅交换内部句柄,不会触发远程通知 } // 辅助函数的占位实现 void close_connection(int handle) { /* 实际关闭连接的逻辑 */ } void notify_remote_disconnect(int handle) { /* 通知远程端的逻辑 */ } };
在这个例子里,remote_connection的移动赋值会在转移资源时通知远程端断开,但swap只是交换两个对象的内部资源,完全不需要触发这个通知行为——这时候自定义swap就很有必要,能避免不必要的远程交互。另外,如果这个类没有提供移动赋值运算符,默认的swap会依赖拷贝操作,效率会很低,这时候自定义swap也能大幅提升性能。
内容的提问来源于stack exchange,提问作者sergs
相关产品推荐
相关产品推荐

