Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 共享\u ptr投射与静态\u投射速度_C++_Qt_Shared Ptr_Static Cast - Fatal编程技术网

C++ 共享\u ptr投射与静态\u投射速度

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);

哪个投法更快?对象指针的静态\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);
类基;
派生类: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。“两个强制转换都在编译时而不是运行时执行”你是什么意思?