C ++智能指针性能

时间:2008-11-21 11:24:55

标签: c++ boost smart-pointers

使用智能指针多少钱,特别是boost :: shared_ptr在时间和内存方面与裸指针相比成本更高?对于游戏/嵌入式系统的性能密集型部分,是否更好地使用裸指针?您是否建议使用裸指针或智能指针来处理性能密集型组件?

6 个答案:

答案 0 :(得分:21)

取消引用智能指针通常是微不足道的,当然是为了在发布模式下提升。所有增强检查都在编译时进行。 (智能指针理论上可以跨线程做聪明的东西)。这仍然留下了许多其他操作。尼古拉提到建筑,复制和破坏。但这不是完整的集合。其他重要操作是交换,分配和重置为NULL。基本上,任何需要智能的操作。

请注意,某些智能指针会排除其中一些操作。例如。 boost::scoped_ptr甚至无法复制,更不用说分配了。由于这会减少操作,因此可以针对这些较少的方法优化实现。

事实上,随着TR1的出现,编译器很可能使用智能指针而不是原始指针做得更好。例如。编译器有可能证明智能不可复制指针在某些情况下没有别名,仅仅因为它是不可复制的。想一想:当创建指向同一对象的两个指针时会发生别名。如果第一个指针无法复制,第二个指针最终会指向同一个对象? (也有方法 - 操作员*必须返回左值)

答案 1 :(得分:7)

Boost提供不同的智能指针。通常,内存占用(根据智能指针的种类而变化)和性能都不应成为问题。要进行效果比较,您可以查看http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/smarttests.htm

正如您所看到的,性能比较只考虑构造,复制和销毁,这意味着取消引用智能指针的成本与原始指针的成本相同。

以下代码段演示了使用shared_ptr<>代替原始指针不会导致性能下降:

#include <iostream>
#include <tr1/memory>

int main()
{
#ifdef USE_SHARED_PTR
    std::tr1::shared_ptr<volatile int> i(new int(1));
#else
    volatile int * i = new int(1);
#endif

    long long int h = 0;

    for(long long int j=0;j < 10000000000LL; j++)
    {
        h += *i;
    }

    std::cout << h << std::endl;
    return 0;
}

答案 2 :(得分:6)

处理性能问题的唯一方法是分析您的代码。无论如何,性能问题的最大部分是想象的;只有剖析会指出你的瓶颈所在。

如果事实证明使用智能指针会产生原始指针不存在的瓶颈,请使用原始指针!在那之前,我不会过分担心它;智能指针上的大多数操作都相当快。你可能经常比较字符串(或类似的东西),因为它们很重要。

答案 3 :(得分:2)

引用计数的智能指针(最常见的类型)在复制,创建和删除它们时成本更高。如果你要复制很多,这个额外的成本可能很大,因为大多数都是线程安全的。

如果你只是想要一个“自动删除”指针,那么就会有很多恶意的auto_ptr,或者来自C ++ 0x的新的闪亮的(但尚未支持的)unique_ptr。

答案 4 :(得分:2)

当我上次使用VC6进行测试时,编译器无法使用智能指针优化代码,也无法使用原始指针优化代码。事情可能会发生变化。

答案 5 :(得分:2)

boost::ptr_container类的形式中,“手动”管理的std::vector<T*>(即原始指针)和std::vector<boost::shared_ptr<T> >之间经常被忽视的中途。

这些将原始指针容器的性能与智能指针容器的便利性结合在一起(即它们提供了人们希望std::auto_ptr提供的STL容器的功能,if that worked)。