コンストラクター シンボルの二重発行
GCC または Clang でコンパイルされた C コードでは、コンストラクター定義が静的ライブラリで 2 回現れることがよくあります。この動作により、重複の理由とその影響について疑問が生じます。
デュアル エミッションの原因
Itanium C ABI によると、コンストラクターのマングル名はプレフィックスで構成されています。 、ネストされたクラスと関数の名前、ネストされた終了タグ、およびパラメーター情報。ただし、仮想基本クラスを持たないクラスのコンストラクターの場合、GCC はさらに、「完全オブジェクト コンストラクター」 (C1) と「基本オブジェクト コンストラクター」 (C2) の 2 つのバリアントを発行します。
この二重の発行は、ABI のサポートに由来しています。多態性。クラスに仮想基本クラスがない場合でも、ABI ではポリモーフィックな処理を容易にするためにこの二重放出が必要です。
二重放出の影響
2 つのコンストラクター シンボルを発行しているにもかかわらず、 GCC は、コンパイルの最適化中にシンボルを同じコードにエイリアスします。これは、複数の定義エラーがないことを意味します。
さらに、両方のコンストラクター シンボルに対して生成されたアセンブリ コードは、それらが同じ基礎となるコンストラクター ロジックを呼び出すことを示しています。どのシンボルが呼び出されるかに関係なく、完全なオブジェクト コンストラクターが呼び出されます。この動作は、厳密に必要でない場合でも、C2 シンボルが ABI の多態性サポートの名残であることを意味します。
以上がC コンストラクターのシンボルが静的ライブラリに 2 回現れるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。