...大致与典型std::string::operator==()
相比较?我在下面提供一些更多细节,我不确定它们是否具有任何相关性。复杂性或近似性的答案足够好。谢谢!
详细信息:我将在列表中的for循环中使用它来查找某些特定实例。我估计我的平均继承级别为3.5级。我正在寻找的那个有一个父类,一个祖父母和两个“接口”之上,即用几个virtual void abc() = 0;
抽象类。
我要找的那个没有子类。
答案 0 :(得分:12)
这在很大程度上取决于您的编译器,您的特定类层次结构,硬件,各种因素。您确实需要在特定应用程序中直接测量。您可以使用rdtsc或(在Windows上)QueryPerformanceCounter来获得相对高精度的计时器。确保数千个dynamic_cast<>的时间循环或雪橇,因为即使QPC只有¼μs的分辨率。
在我们的应用中,一个dynamic_cast<>成本约为1微秒,字符串比较约为3ns /字符。
dynamic_cast<>和stricmp()位于我们的配置文件的顶部,这意味着使用它们的性能成本非常高。 (坦率地说,在我们的工作中,让这些功能在配置文件中如此之高是不可接受的,我不得不重写一堆使用它们的其他人的代码。)
答案 1 :(得分:6)
最好的答案是衡量,我的猜测是dynamic_cast
比比较除最短的字符串(或者甚至比短字符串)更快。
话虽这么说,试图确定一个对象的类型通常是设计糟糕的标志,根据Liskov's substitution principle你应该只对待对象并使虚拟函数表现正确而不检查从外面打字。
编辑:在重新阅读您的问题之后,我会坚持我将要寻找的那个没有子类。
在这种情况下,您可以直接使用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;
}
<强>输出:强>
真
真正
假的