std :: static_pointer_cast是否有任何额外的运行时开销?

时间:2013-12-07 22:35:24

标签: c++

与static_cast相比,即。所以,如果我们有这两个演员

Base* b(new Derived());
Derived* d = static_cast<Derived*>(b); // (1)

shared_ptr<Base> b(new Derived());
shared_ptr<Derived> d = static_pointer_cast<Derived>(b); // (2)

第(2)行是否比第(1)行慢?

2 个答案:

答案 0 :(得分:7)

是的,它有更多的开销,因为它必须返回一个新的shared_ptr而不是一个新的原始指针。

提升实施是:

template<class T, class U> shared_ptr<T> static_pointer_cast( shared_ptr<U> const & r ) BOOST_NOEXCEPT
{
    (void) static_cast< T* >( static_cast< U* >( 0 ) );

    typedef typename shared_ptr<T>::element_type E;

    E * p = static_cast< E* >( r.get() );
    return shared_ptr<T>( r, p );
}

因此返回行创建一个shared_ptr,它拥有与您正在投射的shared_ptr完全相同的原始指针。看看这个构造函数,它将导致被管理的指针和指向控制块的指针的分配 - 这是额外的开销。它基本上是两个指针赋值而不是一个。

编辑2:还会有一个原子引用计数增量,其性能影响将超过正常增量。

编辑:适用性能问题的常见警告。实施可以有所不同。这不是标准规定的开销。始终始终衡量绩效!

答案 1 :(得分:1)

shared_ptr保留公共控制块中引用对象销毁所需的信息以及删除函数。公共控制块在同一引用对象的shared_ptr个实例之间共享。 static_pointer_cast仅将指针强制转换为shared_ptr实例,因此,即使它可以更改指针值,它也不应涉及任何额外开销({{1除外)实例创建,与复制一个实例一样。)

但是,AFAIK没有正式的保证(但检查它是否对您很重要)。

相关问题