【问题标题】:Shared_ptr cast vs static_cast speedShared_ptr cast 与 static_cast 速度
【发布时间】:2017-05-30 07:26:12
【问题描述】:

哪个演员更快?对象指针的static_cast还是shared_ptr的static_cast?

qt 中的示例:

class Base;
class Derived:Base;

auto newBase = QSharedPointer<Base>::create();
auto Derived1 = static_cast<Derived*>(newBase.data());
auto Derived2 = qSharedPointerCast<Derived>(newBase);

哪个操作更快,为什么? (我可能有一些语法错误,但我希望我没有)。

【问题讨论】:

  • 两种转换都在编译时而不是在运行时执行。你真的对编译中的一些 usec 感兴趣吗?无论如何static_cast 应该更快。 qSharedPointerCast 执行额外检查,然后调用 static cast
  • @KonstantinT。当我执行强制转换时,QSharedPointer 中的计数器会增加吗?谢谢。
  • 如果你执行静态转换计数器将不会增加。这意味着计数器将与您执行施法之前相同。如果您执行 qSharedPointerCast,您将有两个 sharedpointer 和 counter 将等于两个。
  • @KonstantinT。 “两种转换都在编译时而不是在运行时执行”你是什么意思?

标签: c++ qt shared-ptr static-cast


【解决方案1】:

qSharedPointerCast 复制指针,从而增加数据块的引用计数,并花费您锁定的高速缓存行更新。 static_cast&lt;Derived*&gt;(newBase.data()) 使用已经存在的指针并且不会增加任何内容 - 它只是一个类型安全的编译时构造,它没有开销。

【讨论】:

    【解决方案2】:

    由于newBase 拥有Base 的实例并且您转换为Derived,因此您的示例显然是未定义的行为(代码中的错误)。

    auto Derived1 = static_cast&lt;Derived*&gt;(newBase.data()); 必须快一点,因为它不会创建新的强引用,因此不会增加引用计数器。 qSharedPointerCast&lt;Derived&gt;(newBase) 必须这样做。

    无论如何,速度差异是如此之小以至于无关紧要。您正在为微优化而战。如果您进行一些测量,我怀疑您会注意到显着差异。

    请将您的精力集中在理解继承(依赖倒置)以及指针如何处理它上,暂时忽略这些微小的优化。

    【讨论】:

      猜你喜欢
      • 2010-10-12
      • 2011-04-07
      • 1970-01-01
      • 2019-03-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多