1

这可以看作是对例如为什么共享指针分配“交换”?.

问题是关于在 boost 中使用的 Copy&Swap 成语。

我确实理解 Copy&Swap 的好处是重用现有代码,从而避免重复和错误。但是有两种情况(实际上可以减少到另一种)不是最佳的:

  1. 智能指针实例相同
  2. 包含的指针是一样的

因为shared_ptrref 计数器是自动递增的,并且对于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确实 涉及对引用计数器的不必要修改。

4

1 回答 1

0

自分配不是一种常见情况,因此每次测试它然后以任何一种方式交换它都会花费更多。此外,复制指针基本上是可以执行的最快复制。

复制 shared_ptr 的实际成本是原子引用增量(可能涉及在下面使用互斥锁)。

如果您真的想测试这两种方法的性能,我建议您获取谷歌基准库并编写一组测试用例(用于自我分配和所有其他情况)并对其进行测量。请记住,如今的优化器可以对您的代码进行优化以优化它。如果不测量它,很难判断这是否更快,但我想好像很贵,没有它的版本会更好:)

编辑:

如果您不想增加引用计数(这是复制 shared_ptr 的昂贵部分),您始终可以使用移动构造函数:

smart_ptr a(new foo);
auto b = a;
...
// Eventually:
a = std::move(b);
于 2018-07-30T11:35:22.720 回答