web-dev-qa-db-ja.com

RTTIなしでc ++をコンパイルすると問題が発生する場合

Gccの_-fno-rtti_フラグを使用して、ランタイム型情報なしでC++をコンパイルしています。

_dynamic_cast<>_またはtypeid()を使用していないと仮定すると、後の問題につながる可能性のあるものはありますか?

53
McPherrinM

質問はGCCに固有のものであるため、使用しているバージョンのドキュメントを注意深く参照する必要があります。 GCC 4.5.2のドキュメントには、次のように書かれています。私の読書からは、dynamic_castとtypeidを避ければ大丈夫だということを示しているでしょう。とはいえ、-fno-rttiの個人的な経験はありません。おそらく、-fno-rttiを使用している理由について詳しく説明することができます。

-fno-rtti
C++ランタイム型識別機能(dynamic_castおよびtypeid)が使用する仮想関数を持つすべてのクラスに関する情報の生成を無効にします。言語のこれらの部分を使用しない場合は、このフラグを使用してスペースを節約できます。例外処理では同じ情報が使用されますが、必要に応じて生成されることに注意してください。 dynamic_cast演算子は、実行時の型情報を必要としないキャスト、つまりvoid *または明確な基本クラスへのキャストに引き続き使用できます。

RTTIはありませんが、仮想メソッドはまだ で利用可能な仮想関数とRTTIの関係についての議論があります。短いバージョンでは、RTTIがなくても仮想関数は問題ないはずです。

38
Bowie Owens

Rttiなしでgccを5年間使用しましたが、特定の問題はありません(dynamic_castまたはtypeidは使用していません)

5
Steve