Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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++ 动态_cast每次调用是否比带有null检查的缓存var更昂贵?_C++_Casting - Fatal编程技术网

C++ 动态_cast每次调用是否比带有null检查的缓存var更昂贵?

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

对于一个类中的函数,如果要长时间(许多小时)每秒调用100次或100次以上,以下哪种方法在性能方面更好

  • 每次调用函数时,使用
    dynamic cast
    将变量转换为所需类型:

    Foo()
    {
      TypeA* A = dynamic_cast<TypeA>(B);
      // do something with A
    }
    
    Foo()
    {
    A型*A=动态铸型(B);
    //带着一个微笑做某事
    }
    
  • 将强制转换的结果缓存到所需类型的变量,仅在缓存为null时强制转换,否则使用缓存:

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