【问题标题】:Any hit for dereferencing std::tr1:shared_ptr vs. dereferencing a naked pointer?取消引用 std::tr1:shared_ptr 与取消引用裸指针有什么关系吗?
【发布时间】:2011-05-18 18:34:55
【问题描述】:

我意识到创建、分配、复制和销毁 std::tr1::shared_ptr 或 boost::shared_ptr (由于引用计数机制)会影响(有时很重要)性能。是否正确,一旦构造,访问由 shared_ptr 包裹的指针没有性能损失?

换句话说:给定

std::tr1::shared_ptr<myClass> SharedA(new myClass);
myClass *NakedA = new myClass;

SharedA->someClassMember

具有与

相同的开销
NakedA->someClassMember

?

【问题讨论】:

  • 我不知道,当你测量它时会发生什么?
  • 有什么选择?即使需要,也不使用 shared_ptr?
  • @Doug T.- 在简单的测试用例中,它似乎没有什么不同,但是在我正在处理的大型代码中,我的分析器在访问指针时显示了一些开销(尽管它看起来它应该是内联的,因此没有区别)
  • @Bo- 从技术上讲,托管指针不是“需要的”。它往往是一个很好的设计选择,并且在大多数情况下应该被使用。就我而言(一个科研组代码),我可以负担构造/分配/等的开销,但访问 shared_ptr 会拖慢速度,据我了解,情况并非如此。
  • 您使用的是哪种分析器?如果 operator-&gt; 方法已被内联,则采样分析器应该无法区分。无论如何,检测分析器都会记录该方法的调用,并且测量结果会出现偏差,因为它不会测量在普通旧指针上使用普通旧 -&gt; 运算符,因为它根本不会检测这些指令。

标签: c++ pointers boost smart-pointers tr1


【解决方案1】:

在没有调试支持的优化构建中,不应该有任何开销。您可以通过查看您正在使用的实现来找出答案。很有可能,它的operator-&gt; 重载只是返回指向指向对象的指针,而它的operator* 重载只是取消引用这个指针。

(这就是 std::shared_ptr 的 Visual C++ 2010 实现所做的:每个重载的运算符只调用一个“get”函数,该函数只返回指针;没有任何类型的锁定或其他开销。其他实现可能不同。)

未优化的构建可能不会内联运算符重载,并且如果您的实现具有您启用的额外调试支持,它可能会执行额外的检查(例如,如果您取消引用空指针,可能会执行断言)。

【讨论】:

  • 谢谢詹姆斯-这是我的怀疑,但如果我看不清楚,我不想一直追着我的尾巴。
【解决方案2】:

智能指针的所有成员函数,包括取消引用运算符,都可以内联。任何好的编译器都应该优化掉抽象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 2017-11-03
    • 2013-02-20
    • 2019-05-20
    相关资源
    最近更新 更多