この一見単純な質問に対する答えはどこにも見つかりません。
次の C++ 関数は RTTI を使用しますか? 確かにそうである必要はありませんが、コンパイル時に typeid が決定されるという保証があるかどうか疑問に思っていました。
template <typename T>
const char *getName()
{
return typeid(T).name(); // Resolved at compile time?
}
typeid
はオブジェクトではなく型に適用されるため、実行時の型情報がないため、オーバーヘッドは問題になりません。
一方、私が見る限り、標準では値がいつ決定されるかについて要件が定められていないため、実行時のオーバーヘッドがないという保証はありません。
編集:
もちろん、(おそらく) 保証がないという事実は、それが合理的な仮定ではないという意味ではありません。コンパイル時に評価しない
コンパイラを書く人がいるとは思えません。typeid(T)
コメントで述べたように、cpp 参照typeid()
に関する「メモ」セクションには次のように記載されています。
ポリモーフィック型の式に適用すると、typeid 式の評価に実行時のオーバーヘッド (仮想テーブル ルックアップ) が発生する場合があります。それ以外の場合、typeid 式はコンパイル時に解決されます。