1

我没有找到有关auto_ptrshared_ptr性能问题的信息(我使用tr1实现)。由于 shared_ptr 比 auto_ptr 更复杂,所以 auto_ptr 更快?所以一般问题听起来像你对shared_ptr的性能与auto_ptr的比较有什么看法?

PS:我知道现在 unique_ptr 比 auto_ptr 更可取,但并非所有编译器都支持它,所以问题是关于 auto_ptr 和 shared_ptr

4

4 回答 4

4
  1. 取消引用时没有性能差异。

  2. 如果您使用 make_shared 分配 shared_ptr,则不会浪费任何堆分配。

  3. 复制指针(不是对象)时,shared_ptr 会慢一点,因为它需要增加它的引用计数器。

但是,这些可能无关紧要,所以坚持使用 shared_ptr 和 make_shared。

于 2012-06-12T13:56:27.663 回答
2

auto_ptr是一个已弃用的 C++98 构造。因此,它可能带来的任何性能优势都远远超过了您不应再在新编写的 C++11 代码中使用它,而是要求编译器/库维护者实现对unique_ptr.

That being said, use what semantically fits your use case, unless you have profiled that you have a problem with *_ptr...

于 2012-06-12T13:59:40.987 回答
1

一般来说,唯一好的答案是测量

但是对于这种情况,您知道shared_ptr,除非您使用make_shared它涉及计数器块的动态分配,并且除非您有一个非常好的小对象分配器,否则创建第一个肯定会非常慢(谈论数量级)指向对象的共享指针。

但是,也许有了 Boost 和标准库,分配确实得到了优化。也许,也许!,您可以make_shared只为对象及其控制块使用 1 个分配。所以……测量

顺便说一句,auto_ptr已弃用。

使用任何现代编译器unique_ptr代替。

于 2012-06-12T13:56:03.243 回答
1

与所有性能问题一样:您需要在特定设置中自己测量它。

不过,一般而言,您可以预期 a 的开销会shared_ptr<>比 for更多,auto_ptr<>因为它必须在幕后做更多的工作以确保封闭指针的正确共享行为。

另一方面,两者并没有真正的可比性:auto_ptr<>仅支持一个副本(所有权在副本上转移),而shared_ptr<>支持多个副本。因此,除非您仅将上述指针用于一个复制指针,否则您无法进行有意义的比较。如果您确实使用单副本指针并且您确定不需要更多副本,请使用专门的auto_ptr<>.

无论如何,性能差异是否显着取决于您的特定项目。

于 2012-06-12T13:58:32.370 回答