这可以看作是对例如为什么共享指针分配“交换”?.
问题是关于在 boost 中使用的 Copy&Swap 成语。
我确实理解 Copy&Swap 的好处是重用现有代码,从而避免重复和错误。但是有两种情况(实际上可以减少到另一种)不是最佳的:
- 智能指针实例相同
- 包含的指针是一样的
因为shared_ptr
ref 计数器是自动递增的,并且对于intrusive_ptr
(仅提升)它们可能是递增的。所以复制成本很高。
如果分配的实现方式如下:
smart_ptr& operator=(const smart_ptr& other){
if(this->ptr_ == other.ptr_) return *this;
smart_ptr(other).swap(*this); // I assume I can simply do this here, right?
return *this;
}
smart_ptr& operator=(smart_ptr&& other){
smart_ptr(std::move(other)).swap(*this);
return *this;
}
这不是最快和最安全的实施,还是我没有看到任何问题?
如果它是最快的,为什么不使用它的 boost 或 stdlib?
为了澄清第 2 点,请考虑以下代码:
smart_ptr a(new foo);
auto b = a;
...
// Eventually:
a = b;
这不是自分配&a != &b
。Copy&Swap确实 涉及对引用计数器的不必要修改。