我想檢查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