2011-02-09 10 views
11

私は、g++によってコンパイルされた私のプログラムにstringsを実行すると、出力に使用するさまざまなクラスの名前が含まれていることがわかりました。g ++はコンパイルされたバイナリにクラス名を格納するのはなぜですか?

プログラムは-O3でコンパイルされ、-gまたは-pはなく、バイナリを削除するとクラス名が表示されます。

g++がこの情報をバイナリに格納する必要があるのはなぜですか?すべて存在するクラス名は、仮想関数を使用するクラスのように見えるので、これはそれと関係があります。

+0

ポイント: 'g ++ -c blah.o blah.cpp'を使用すると、実行可能ファイルとしてリンクするまでクラス名が含まれません。 – mkb

答えて

12

これは、RTTIと関係があります。具体的には、RTTIでは、指定された変数のクラス名をクエリできます。 typeidキーワードを参照してください。これが当てはまる場合、なぜ仮想関数を持つクラスでのみ起こるのかを説明します.RTTIは仮想関数を持つクラスに対してのみ機能します。

+0

ええ、それはRTTIに見えますが、私は再び-fno-rttiでコンパイルし、クラス名は文字列の出力には現れません。 – Xeno

+0

@Xeno:gccは、 'typeid(x).name()'を使用するときに、クラスの変更された名前を返します。 –

3

はい、おそらくg ++がRTTIを実装する方法と関係しています。実行時にクラスツリーから適切な型を検索する必要があるため、そのツリーを何らかの形で格納する必要があります。仮想関数を持つクラスはすべて「多態性」とみなされ、特別なRTTI情報が実行可能ファイルに含まれている必要があります。標準ではこれがどのように行われているかは分かりませんが、クラス名は何かと同じくらい意味があります。

+0

これは実際には名前だけを格納する必要はなく、idだけです。たとえば、ハッシュも機能します。 –

+0

いいことは、私はそれがしたと主張したことはありません。 –

4

g ++にはRTTIがデフォルトで有効になっています。 RTTIが必要ない場合は、-fno-rttiスイッチを使用し、文字列が存在しないことがわかります。

+0

RTTIを無効にすると通常は例外も無効になることに注意してください.RTTIと例外処理では通常、いくつかの仕組みが共有されるためです。 –

関連する問題