タイプ名 (つまり、typeid(int)、typeid(std::string)...) を使用すると、コンパイル時に typeid が評価されることを確認したかったのです。
そのために、2 つの typeid 呼び出しの比較をループで繰り返し、最適化を有効にしてコンパイルしました。そうではありません)。
そして、コンパイラがコードを単純化する場合とそうでない場合があるため、奇妙な結果が得られます。私は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;
}
この問題が発生する条件は明確ではありませんが、
- 継承が含まれていない場合は問題ありません (常にコンパイル時)
- 比較を 1 回だけ行う場合は問題ありません
- 問題は比較の論理和でのみ発生します。すべての条件は誤りです
typeid がどのように機能するかについて私が得られなかったものがありますか (型名で使用される場合、コンパイル時に常に評価されることになっていますか?)、またはこれは評価または最適化における gcc のバグでしょうか?
コンテキストについては、この非常に単純化された例に問題を突き止めましたが、私の目標はテンプレート型で typeid を使用することです (部分的な関数テンプレートの特殊化は不可能であるため)。
ご協力いただきありがとうございます!