auto_ptr与shared_ptr的性能

时间:2012-06-12 13:51:50

标签: c++ boost shared-ptr smart-pointers auto-ptr

我没有找到有关 auto_ptr shared_ptr (我使用 tr1 实施)的性能问题的信息。由于shared_ptr比auto_ptr更复杂所以auto_ptr更快?所以一般来说问题听起来像你可以说与shared_ptr的性能有什么关系?与auto_ptr进行比较?

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

4 个答案:

答案 0 :(得分:4)

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

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

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

  4. 然而,这些可能并不重要,所以坚持使用shared_ptr和make_shared。

答案 1 :(得分:2)

auto_ptr是一个弃用的C ++ 98结构。因此,可能所具有的任何性能优势远远超过您不应再在新编写的C ++ 11代码中使用它,而是使编译器/库维护者执行以下操作支持unique_ptr

话虽如此,使用语义符合您的用例,除非您有 profiled 您有*_ptr的问题...

答案 2 :(得分:1)

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

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

但是,或许可以使用Boost和标准库来实现分配优化。或许,可能!,您可以使用make_shared仅对对象及其控制块使用1个分配。所以...... 衡量

顺便说一下,auto_ptr已被弃用。

任何现代编译器都使用unique_ptr

答案 3 :(得分:1)

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

但是,一般来说,shared_ptr<>auto_ptr<>需要更多的开销,因为它必须在场景后面做更多的工作,以确保封闭指针的正确共享行为。 / p>

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

在任何情况下,性能差异是否显着都取决于您的特定项目。