typeidは、同じ型に対して異なるtype_infoインスタンスをいつ返すことができますか?

StackOverflow https://stackoverflow.com/questions/1819114

質問

Andrei Alexandrescu は、モダンなC ++デザイン

  

typeidによって返されるオブジェクトは   静的ストレージなので、必要はありません   生涯の問題を心配する。

Andreiは続けています:

  

この規格は、   たとえば、typeid(int)の各呼び出し   同じへの参照を返します   type_infoオブジェクト。

標準ではこれが保証されていませんが、GCCやVisual Studioなどの一般的なコンパイラーではどのように実装されていますか?

&typeid(T) != &typeid(T)がリークしない(および呼び出しごとに新しいインスタンスを返す)と仮定すると、それは1つの<!> quot; table <!> quot;です。アプリケーションごと、翻訳単位ごと、dll / soごと、またはまったく異なるものですか?

<=>?

の場合はありますか

主にWindows用のコンパイラに興味がありますが、Linuxやその他のプラットフォーム用の情報も歓迎します。

役に立ちましたか?

解決

  

<!> amp; typeid(T)!= <!> amp; typeid(T)?

     

主にWindows用のコンパイラに興味がありますが、Linuxやその他のプラットフォーム用の情報も歓迎します。

はい。したがって、WindowsではDLLに未解決のシンボルを含めることはできません。お持ちの場合:

foo.h

struct foo { virtual ~foo() {} };

dll.cpp

#include "foo.h"
...
foo f;
cout << &typeid(&f) << endl

main.cpp

<*>

別のポインターを提供します。 dllがロードされる前にtypeid(foo)が存在する必要があるため dllとプライマリexeの両方で

さらに、Linuxでは、メインの実行可能ファイルが-rdynamic(または--export-dynamic)でコンパイルされていない場合、typeidは実行可能ファイルの異なるシンボルに解決され、 共有オブジェクト(通常はELFプラットフォームでは発生しません)では、実行可能ファイルをリンクするときに行われる最適化-不要なシンボルの削除のために行われます。

他のヒント

標準では、実装に自由度を与えるために、特定の動作が指定されていない場合があります。この場合、TypeIDの管理方法はコンパイラーの実装に任されており、単純に一連のルールが与えられています(基本的に、このためのメモリーの割り当て方法については気にしないでください)。

メモリアドレスに基づいてTypeIdを比較できるようにする必要がある特別な理由はありますか? TypeIdは、==と!=を既にオーバーライドして、それらを比較し、一意に識別するために使用されるname()を提供する機能を提供します。

C ++プログラミング言語(Bjarne Stroustrup)を利用できる場合、第15章にはクラス階層の処理に関する多くの詳細があります。そこに別の解決策が見つかるかもしれませんか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top