ホームページ >バックエンド開発 >C++ >仮想基本クラスを持たないクラスのコンストラクターが GCC でコンパイルされたコードで重複して表示されるのはなぜですか?

仮想基本クラスを持たないクラスのコンストラクターが GCC でコンパイルされたコードで重複して表示されるのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-16 16:01:03230ブラウズ

Why do constructors for classes without virtual base classes appear duplicated in GCC-compiled code?

コンストラクター シンボルの二重発行

問題の理解

GCC でコンパイルされたコードでは、仮想基本クラスのないクラスのコンストラクターがライブラリ内で重複して表示される場合があるリストに記載されているため、この動作の背後にある理由について疑問が生じます。さらに詳しく説明すると、Itanium C ABI は、コンストラクターを含む C シンボルの一連の命名規則を定義します。

ABI 解析

これらのコンストラクターのマングルされた名前を調べてみましょう:

  • _Z3fooEv: Thing::foo()
  • _ZN5ThingC1Ei: Thing(int)
  • の完全なオブジェクト コンストラクター_ZN5ThingC2Ei: Thing(int)
  • の基本オブジェクト コンストラクター_ZN5ThingC1Ev: Thing() の完全なオブジェクト コンストラクター
  • _ZN5ThingC2Ev: Thing()

の基本オブジェクト コンストラクター ご覧のとおり、コンストラクターは C1 (完全なオブジェクト コンストラクター) によって区別されます。

さまざまなコンストラクター

この二重性はポリモーフィズムのサポートに由来しますが、この場合は厳密には必須ではありません。完全なオブジェクト コンストラクターはさらに仮想基本クラスを初期化し、基本オブジェクト コンストラクターはデータ メンバーと非仮想基本クラスを初期化します。

複数の定義

ライブラリ リストに複数のエントリがあるにもかかわらず、これらの重複コンストラクターは「シンボル __ の複数の定義」エラーは発生しません。これは、ABI がコンストラクターの型ごとに一意のマングルされた名前を提供し、それらがリンカーによって個別のシンボルとして扱われるようにするためです。

結論

GCC でコンパイルされたコードにおけるコンストラクター シンボルの二重発行これは、多態性サポートと Itanium C ABI 命名規則の結果です。これらの概念を理解すると、この動作の背後にある理由が明らかになり、複数の定義に関する懸念が解決されます。

以上が仮想基本クラスを持たないクラスのコンストラクターが GCC でコンパイルされたコードで重複して表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。