我想检查typeid是否在编译时与类型名称(即typeid(int),typeid(std :: string)...)一起使用时进行评估。类型名称的typeid总是在编译时在C++中进行评估?
为此,我在循环中重复了两个typeid调用的比较,并在启用优化的情况下对其进行了编译,以查看编译器是否简化了循环(通过查看简化为1us的执行时间而不是160毫秒)。
我得到了奇怪的结果,因为有时编译器会简化代码,有时它不会。我用G ++(我尝试了不同的版本4.x版),这里是程序:
#include <iostream>
#include <typeinfo>
#include <time.h>
class DisplayData {};
class RobotDisplay: public DisplayData {};
class SensorDisplay: public DisplayData {};
class RobotQt {};
class SensorQt {};
timespec tp1, tp2;
const int n = 1000000000;
int main()
{
int avg = 0;
clock_gettime(CLOCK_REALTIME, &tp1);
for(int i = 0; i < n; ++i)
{
// if (typeid(RobotQt) == typeid(RobotDisplay)) // (1) compile time
// if (typeid(SensorQt) == typeid(SensorDisplay)) // (2) compile time
if (typeid(RobotQt) == typeid(RobotDisplay) ||
typeid(SensorQt) == typeid(SensorDisplay)) // (3) not compile time ???!!!
avg++;
else
avg--;
}
clock_gettime(CLOCK_REALTIME, &tp2);
std::cout << "time (" << avg << "): " <<
(tp2.tv_sec-tp1.tv_sec)*1000000000+(tp2.tv_nsec-tp1.tv_nsec) <<
" ns" << std::endl;
}
在这个问题似乎并不清楚,但条件:
- 如果没有涉及继承,没有问题(总是编译时间)
- 如果我只做一个对比,没有问题
- 问题只是只与比较的脱节,如果所有的条款都是假的出现
那么,有什么我没有得到以及typeid是如何工作的(当它与nam一起使用时,总是应该在编译时进行评估es?)或者这可能是评估或优化中的gcc错误?
关于上下文,我将这个问题追溯到这个非常简化的例子,但我的目标是使用带有模板类型的typeid(因为部分功能模板专业化是不可能的)。
感谢您的帮助!
您是否完全基于您的代码执行需要多长时间,还是您有更确切的证明编译器实际输出的内容? – 2010-05-20 20:38:52
你可以设计你的程序而不需要'typeid'吗?一个比较对象类型的程序被认为是一个糟糕的OO程序。 – 2010-05-20 20:49:39
Dennis>是的,但我只是检查了汇编代码,我可以确认在一种情况下,在两个clock_gettime调用之间有6条指令没有跳转,另一条指令有2条跳转指令,包括一个明显的循环。 – cyril42e 2010-05-20 21:10:28