C++ 共享\u ptr投射与静态\u投射速度
哪个投法更快?对象指针的静态\u转换还是共享\u ptr的静态\u转换 qt中的示例:C++ 共享\u ptr投射与静态\u投射速度,c++,qt,shared-ptr,static-cast,C++,Qt,Shared Ptr,Static Cast,哪个投法更快?对象指针的静态\u转换还是共享\u ptr的静态\u转换 qt中的示例: class Base; class Derived:Base; auto newBase = QSharedPointer<Base>::create(); auto Derived1 = static_cast<Derived*>(newBase.data()); auto Derived2 = qSharedPointerCast<Derived>(newBase);
class Base;
class Derived:Base;
auto newBase = QSharedPointer<Base>::create();
auto Derived1 = static_cast<Derived*>(newBase.data());
auto Derived2 = qSharedPointerCast<Derived>(newBase);
类基;
派生类:Base;
auto-newBase=QSharedPointer::create();
auto-Derived1=静态_转换(newBase.data());
自动派生2=qSharedPointerCast(新数据库);
哪个操作更快,为什么?(我可能有一些语法错误,但我希望没有)。qSharedPointerCast复制指针,从而增加数据块的引用计数,并需要锁定缓存线更新。
static_cast(newBase.data())
使用已经存在的指针,并且不增加任何内容-它只是一个类型安全编译时构造,没有开销。qSharedPointerCast
复制指针,从而增加数据块的引用计数,并花费锁定的缓存线更新。static_cast(newBase.data())
使用已经存在的指针,不增加任何内容-它只是一个类型安全编译时构造,没有开销。因为newBase
持有Base
的实例,而您将其转换为派生的,所以您的示例显然是未定义的行为(代码中的一个bug)
auto-Derived1=static_cast(newBase.data())代码>必须快一点,因为它不会创建新的强引用,所以引用计数器不会增加qSharedPointerCast(newBase)
必须这样做
无论如何,速度差是如此之小,这是无关的。你在争论微观优化。若你们做一些测量,我怀疑你们会注意到显著的差异
请将精力集中在理解继承(依赖项反转)和指针如何处理这一点上,暂时忽略这一微小的优化。因为newBase
持有Base
的实例,而您转换为派生的
,所以您的示例显然是未定义的行为(代码中的一个bug)
auto-Derived1=static_cast(newBase.data())代码>必须快一点,因为它不会创建新的强引用,所以引用计数器不会增加qSharedPointerCast(newBase)
必须这样做
无论如何,速度差是如此之小,这是无关的。你在争论微观优化。若你们做一些测量,我怀疑你们会注意到显著的差异
请将精力集中在理解继承(依赖项反转)和指针如何处理继承上,暂时忽略这一微小的优化。这两种类型转换都在编译时执行,而不是在运行时执行。你真的对汇编中的一些usec感兴趣吗?无论如何,static\u cast
应该更快qSharedPointerCast
执行其他检查,然后调用static cast
@KonstantinT。执行强制转换时,QSharedPointer中的计数器是否增加?谢谢。若你们执行静态施法,计数器将不会增加。这意味着计数器将与执行强制转换之前相同。如果执行qSharedPointerCast,您将有两个共享指针,计数器将等于两个。@KonstantinT。“两个类型转换都在编译时而不是运行时执行”你是什么意思?两个类型转换都在编译时而不是运行时执行。你真的对汇编中的一些usec感兴趣吗?无论如何,static\u cast
应该更快qSharedPointerCast
执行其他检查,然后调用static cast
@KonstantinT。执行强制转换时,QSharedPointer中的计数器是否增加?谢谢。若你们执行静态施法,计数器将不会增加。这意味着计数器将与执行强制转换之前相同。如果执行qSharedPointerCast,您将有两个共享指针,计数器将等于两个。@KonstantinT。“两个强制转换都在编译时而不是运行时执行”你是什么意思?