C++ 移行ガイド

Cfront のリンク時のインスタンス化

Sun C++ コンパイラのテンプレートは、AT&T の Cfront コンパイラのものとは異なります。Cfront では、リンク時インスタンス化という方式が採用されており、次のようなアルゴリズムになっています。

  1. すべてのユーザーソースファイルをコンパイルする。

  2. プリリンカー (リンクの前処理をするプログラム) を使用して、手順 1 で作成されたすべてのオブジェクトファイルをリンクし、部分リンク済みの実行可能ファイルを作成する。

  3. リンク出力を調べて、ソース中で使用されているテンプレートが存在する、未定義のすべての関数をインスタンス化する。

  4. 作成されたすべてのテンプレートと、手順 2 で作成された部分リンク済みの実行可能ファイルをリンクする。

  5. ソース中で使用されているテンプレート関数が存在する、未定義の関数がなくなるまで、手順 3 と 4 を繰り返す。

  6. 作成されたすべてのオブジェクトファイルに対してリンクを行う。

リンク時インスタンス化の最大の利点は、特殊化 (インスタンス化されたテンプレート関数を無効にするための、ユーザー提供の関数のこと) を処理するための特別な外部サポートが必要ないという点です。コンパイラによるインスタンス化の対象になるのは、ユーザーソースファイルに定義されていない関数だけです。

しかし、リンク時インスタンス化には次の 2 つの大きな欠点もあります。