当前位置:  开发笔记 > 编程语言 > 正文

C++智能指针性能

如何解决《C++智能指针性能》经验,为你挑选了3个好方法。

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



1> MSalters..:

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

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

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



2> Nicola Bonel..:

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

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

以下代码段演示了使用a shared_ptr<>代替原始指针不会造成性能损失:

#include 
#include 

int main()
{
#ifdef USE_SHARED_PTR
    std::tr1::shared_ptr 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;
}



3> 小智..:

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

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

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有