我没有找到有关 auto_ptr 和 shared_ptr (我使用 tr1 实施)的性能问题的信息。由于shared_ptr比auto_ptr更复杂所以auto_ptr更快?所以一般来说问题听起来像你可以说与shared_ptr的性能有什么关系?与auto_ptr进行比较?
PS:我知道现在unique_ptr优于auto_ptr,但并非所有编译器都支持它,所以问题是关于auto_ptr和shared_ptr
答案 0 :(得分:4)
取消引用时,没有性能差异。
如果您使用make_shared分配shared_ptr,则不会浪费任何堆分配。
复制指针(不是对象)时,shared_ptr会慢一点,因为它需要增加它的引用计数器。
然而,这些可能并不重要,所以坚持使用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<>
。
在任何情况下,性能差异是否显着都取决于您的特定项目。