GCC でコンパイルされたコードでは、仮想基本クラスのないクラスのコンストラクターがライブラリ内で重複して表示される場合があるリストに記載されているため、この動作の背後にある理由について疑問が生じます。さらに詳しく説明すると、Itanium C ABI は、コンストラクターを含む C シンボルの一連の命名規則を定義します。
これらのコンストラクターのマングルされた名前を調べてみましょう:
の基本オブジェクト コンストラクター ご覧のとおり、コンストラクターは C1 (完全なオブジェクト コンストラクター) によって区別されます。
この二重性はポリモーフィズムのサポートに由来しますが、この場合は厳密には必須ではありません。完全なオブジェクト コンストラクターはさらに仮想基本クラスを初期化し、基本オブジェクト コンストラクターはデータ メンバーと非仮想基本クラスを初期化します。
ライブラリ リストに複数のエントリがあるにもかかわらず、これらの重複コンストラクターは「シンボル __ の複数の定義」エラーは発生しません。これは、ABI がコンストラクターの型ごとに一意のマングルされた名前を提供し、それらがリンカーによって個別のシンボルとして扱われるようにするためです。
GCC でコンパイルされたコードにおけるコンストラクター シンボルの二重発行これは、多態性サポートと Itanium C ABI 命名規則の結果です。これらの概念を理解すると、この動作の背後にある理由が明らかになり、複数の定義に関する懸念が解決されます。
以上が仮想基本クラスを持たないクラスのコンストラクターが GCC でコンパイルされたコードで重複して表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。