28

興味深いことに、GCC または Clang ツールセットは現在、MSVC の同一の COMDAT フォールディング(ICF) と同等のものを実装していますか? そうでない場合、何か計画はありますか?古い GCC メーリング リストのメッセージ以外に、この件に関する最近の信頼できるリンクが見つからないようです。

そうでない場合、これは、個別の型に対するテンプレートのインスタンス化が、バイナリ互換性がある場合でも、結果のバイナリで常に個別の関数であることを意味しますか (それらが完全にインライン化されていない状況で)、またはこれを処理するための他のメカニズムがありますか?他のレベルで?

また、結果として得られる実行可能ファイルのサイズを実際に最小化する上で、ICF が大きな違いを生んでいることに気付いた人はいますか? テストするのに便利な大規模な MSVC プロジェクトはありません。(たまたま多くの異なる vtable-layout 互換タイプでテンプレートをインスタンス化した場合にのみ、本当に役立つと思います。)

最後に、異なる関数への 2 つの関数ポインタが実行時に等しく比較されるのは C++11 標準に準拠していますか? このリンクはそうではないことを暗示しているようですが、C99 用です。編集:このトピックに関する以前の質問を見つけました

4

1 に答える 1

20

GCC も Clang もリンカーではなく、ICF はリンカーによって実行されるか、少なくともリンカーと協力して実行される必要があります。編集: ICF を実行しないため、はい、個別のインスタンス化によって個別のコードが生成されます。GNUgoldリンカはオプション付きの ICF をサポートし--icfますが、これには GCC オプション-ffunction-sectionsを使用する必要があります。

個別の関数には個別のアドレスが必要です...アドレスが取得された関数に対してICFが無効になっているかどうかは思い出せませんが、そうでない場合は、結合された関数の前にノーオペレーション命令のロードを配置して、それぞれを作ることができるはずです異なるインスタンス化は異なる命令で開始されるため、異なるアドレスを持ちます。編集: ゴールドの--icf=safeオプションは、アドレスが取得されていないことが証明できる関数に対してのみ ICF を有効にするため、個別のアドレスに依存するコードは引き続き機能します。

ICF は適切な最適化ですが、必須ではありません。少し努力すれば、非依存コードを非テンプレート、またはパラメーターの少ないテンプレートに巻き上げて、実行可能ファイル内の重複コードの量を減らすことができます。これについては、私が数年前に行ったダイエット テンプレートの講演のスライドに詳しい情報があります。

于 2013-03-02T00:15:14.213 に答える