C++ 动态_cast每次调用是否比带有null检查的缓存var更昂贵?
对于一个类中的函数,如果要长时间(许多小时)每秒调用100次或100次以上,以下哪种方法在性能方面更好C++ 动态_cast每次调用是否比带有null检查的缓存var更昂贵?,c++,casting,C++,Casting,对于一个类中的函数,如果要长时间(许多小时)每秒调用100次或100次以上,以下哪种方法在性能方面更好 每次调用函数时,使用dynamic cast将变量转换为所需类型: Foo() { TypeA* A = dynamic_cast<TypeA>(B); // do something with A } Foo() { A型*A=动态铸型(B); //带着一个微笑做某事 } 将强制转换的结果缓存到所需类型的变量,仅在缓存为null时强制转换,否则使用缓存: Foo()
dynamic cast
将变量转换为所需类型:
Foo()
{
TypeA* A = dynamic_cast<TypeA>(B);
// do something with A
}
Foo()
{
A型*A=动态铸型(B);
//带着一个微笑做某事
}
Foo()
{
TypeA* A = GetCachedA();
// do something with A
}
TypeA* GetCachedA()
{
if(CachedA == nullptr)
CachedA = dynamic_cast<TypeA>(B);
return CachedA;
}
Foo()
{
TypeA*A=GetCachedA();
//带着一个微笑做某事
}
TypeA*GetCachedA()
{
if(CachedA==nullptr)
CachedA=动态投影(B);
返回CachedA;
}
动态\u cast
非常昂贵,它倾向于缓存指针。但那是我在一台过时的机器上进行的测试,情况与你的不同
当时,我使用了稍微不同的基本设计。我没有检查空指针,而是使用指向函数的指针(可以使用虚拟函数代替…),该函数被初始化为指向执行动态强制转换的函数,保存结果,然后(关键部分)使用刚刚返回缓存指针的函数的地址重写函数指针
这在向缓存添加指针时增加了一点额外的开销,但在后续使用中减少了(相当多)。至少在我的测试中,只要你至少使用了三次指针(但是,在这里,你的里程可能也可能会有所不同),这就是一次胜利。如果你对它感兴趣,请编写一些代码对其进行基准测试。如果你已经知道类型是正确的,只需执行一个免费的
静态\u cast
。如果有可能不是这样的话,在这种情况下,您的缓存每次都会执行失败的动态\u cast
。使用一些额外的虚拟函数扩展接口,这样您就不可能关心类型是什么了?您需要根据实际类型采取不同的操作
-这是糟糕设计的定义。可能不适合您的使用大小写,但是如何处理TypeA*GetCachedA(){static TypeA*CachedA=dynamic_cast(B);返回CachedA;}
?