typeid (즉, typeid (int), typeid (std :: string) ...)와 함께 사용할 때 typeid가 컴파일 타임에 평가되는지 확인하고 싶습니다.형식 이름의 typeid는 항상 C++에서 컴파일 타임에 평가됩니까?
그렇게하기 위해 컴파일러에서 루프를 간소화했는지 확인하기 위해 두 개의 typeid 호출을 루프로 반복하고 최적화를 사용하여 컴파일했습니다 (실행 시간을 단순화 할 때 1us를보고 160ms가 아니라).
그리고 때때로 컴파일러가 코드를 단순화하기 때문에 이상한 결과를 얻습니다. 때로는 그렇지 않습니다. 나는 (나는 다른 4.x의 버전을 시도) ++ g을 사용하고, 여기에 프로그램입니다 :
#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가 작동하는 방법 (type nam과 함께 사용될 때 항상 컴파일 타임에 평가되어야한다고 생각한다. es?) 또는 평가 또는 최적화에서 gcc 버그 일 수 있습니까?
컨텍스트에 대해이 간단한 예제를 사용하여 문제를 추적했지만 내 목표는 템플릿 유형에 typeid를 사용하는 것입니다 (부분 함수 템플릿 특수화는 불가능 함).
도움 주셔서 감사합니다.
코드를 실행하는 데 얼마나 오래 걸릴지에 대한 결론을 내리고 있습니까? 아니면 컴파일러가 실제로 출력하고 있는지에 대한 확실한 증거가 있습니까? –
'typeid'가 없어도 프로그램을 디자인 할 수 있습니까? 객체 유형을 비교하는 프로그램은 잘못 형성된 OO 프로그램으로 간주됩니다. –
Dennis> 예, 방금 asm 코드를 확인한 결과 두 번의 clock_gettime 호출 사이에 점프가없는 6 가지 명령어가 있고 다른 명령어에서는 명확한 루프를 포함하여 2 가지 점프가 포함 된 15 가지 명령어가 있음을 확인할 수 있습니다. – cyril42e