gpt4 book ai didi

c++ - 共享指针的 copy-and-swap 效率

转载 作者:太空宇宙 更新时间:2023-11-04 12:45:57 24 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

self 赋值并不常见,因此每次测试它都会花费更多,然后再以任何一种方式交换它。同样复制指针基本上是可以执行的最快的复制。

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

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

编辑:

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

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

关于c++ - 共享指针的 copy-and-swap 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51592706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com