Shared_ptr强制转换与static_cast速度

时间:2017-05-30 07:26:12

标签: qt shared-ptr static-cast

哪个演员阵容更快?对象指针的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);

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

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

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