【问题标题】:Copy&Swap efficiency for shared pointers共享指针的复制和交换效率
【发布时间】:2019-01-06 15:06:48
【问题描述】:

这可以看作是对例如Why shared pointer assignment does 'swap'?.

问题是关于 e.g. in boost 使用的 Copy&Swap 习语。

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

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

对于shared_ptr,引用计数器自动递增,对于intrusive_ptr(仅限boost),它们可能是。所以复制一份成本很高

这可以避免,如果分配是这样实现的:

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确实涉及对引用计数器的不必要修改。

【问题讨论】:

  • copy ctor 没有被调用,它已经被优化了,因为它们只是交换、移动和复制指针。
  • 自赋值是一种非常少见的情况。通过复制和交换,您可以摆脱自分配测试,并为常见情况获得一点额外的性能,而且是在其良好的代码重用之上。
  • 这与指针复制 ctor 和 smart_ptr 复制 ctor 调用无关。 @phön 我添加了一个片段以澄清它不是(仅)自我分配,在这种情况下性能会丢失
  • 分支比无用的小型复制操作成本更高。这是 CPU 优化的结果。所以最好不要进行检查。也许有人会提供一个关于这个的链接(我没有时间寻找它)?
  • @Flamefire 好吧,我认为即使是这种情况也很罕见。我不确定这是否是除了代码重用与幼稚实现之外的复制和交换的唯一参数

标签: c++ smart-pointers copy-and-swap


【解决方案1】:

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

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

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

编辑:

如果您不想增加引用计数(复制 shared_ptr 的成本很高),您可以随时使用移动构造函数:

smart_ptr a(new foo);
auto b = a;
...
// Eventually:
a = std::move(b);

【讨论】:

  • 这忽略了一点,smart_ptr 的副本涉及 ref 计数器的昂贵的原子递增/递减。 只是复制指针。我明确地以shared_ptr/intrusive_ptr 为例。对于unique_ptr,你是正确的。
  • 对不起,我认为编辑让它更清楚了。我添加了几句话:) 希望它可以帮助将来的人。
  • @wdudzik 在您的代码 sn-p 中,代码具有不同的行为,可能不是 OP 想要的,因为它“躲避”了 OP 询问的问题
  • 正确。 b 可能存储在一个类中,四处移动,来自其他地方(可能是注册表?)并且可以访问,例如通过某个类的 get 成员函数。所以把它从那里移走是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2017-05-14
  • 2023-03-23
  • 2020-10-15
  • 1970-01-01
  • 2020-09-10
  • 2013-11-28
相关资源
最近更新 更多