typeidは、同じ型に対して異なるtype_infoインスタンスをいつ返すことができますか?
-
10-07-2019 - |
質問
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章にはクラス階層の処理に関する多くの詳細があります。そこに別の解決策が見つかるかもしれませんか?