dynamic_cast <>的速度有多快

Jon*_*röm 9 c++ performance dynamic-cast stdstring

...大致相比典型std::string::operator==()?我在下面提供一些更多细节,我不确定它们是否具有任何相关性.复杂性或近似性的答案足够好.谢谢!

详细信息:我将在列表中的for循环中使用它来查找某些特定实例.我估计我的平均继承级别为3.5级.我正在寻找的那个有一个父类,一个祖父母和两个"接口"之上,即用几个抽象类virtual void abc() = 0;.

我正在寻找的那个没有子类.

Cra*_*rks 12

它在很大程度上取决于您的编译器,您的特定类层次结构,硬件,各种因素.您确实需要在特定应用程序中直接测量它.您可以使用rdtsc或(在Windows上)QueryPerformanceCounter来获得相对高精度的计时器.确保数千个dynamic_cast <> s的时间循环或雪橇,因为即使QPC只有¼μs的分辨率.

在我们的应用程序中,dynamic_cast <>的成本约为1微秒,字符串比较约为3ns /字符.

dynamic_cast <>和stricmp()都位于我们的配置文件的顶部,这意味着使用它们的性能成本非常高.(坦率地说,在我们的工作中,将这些函数放在配置文件中如此之高是不可接受的,我不得不重写一堆别人使用它们的代码.)

  • 哇.`dynamic_cast`比字符比较慢三个数量级?那真是怪了.**编辑**虽然不是很奇怪,因为`dynamic_cast`可能需要遍历内存中的树(这意味着随机访问和多次缓存未命中),而字符串比较适用于缓存内存. (2认同)

Mot*_*tti 6

最好的答案是测量,我的猜测dynamic_cast是比比较除最短的字符串(或者甚至比短字符串)更快.

话虽这么说,试图确定一个对象的类型通常是设计糟糕的标志,根据Liskov的替换原则,你应该只对待对象并使虚拟函数表现正确,而不从外部检查类型.


编辑:重新阅读你的问题之后我会坚持到那里没有找到一个子课程. 在这种情况下你可以typeid直接使用,我相信它应该比你的任何一个选项更快(虽然在我看来寻找特定类型仍然是代码味道)

#include <iostream>
#include <typeinfo>

struct top {
    virtual ~top() {} 
};

struct left : top { };
struct right : top { };

int main()
{
    left lft;
    top &tp = lft;   
    std::cout << std::boolalpha << (typeid(lft) == typeid(left)) << std::endl; 
    std::cout << std::boolalpha << (typeid(tp) == typeid(left)) << std::endl; 
    std::cout << std::boolalpha << (typeid(tp) == typeid(right)) << std::endl; 
}
Run Code Online (Sandbox Code Playgroud)

输出:

真的

假的