2012-03-30 28 views
-1

C++ 11は、テンプレートクラスのインスタンスが現在のコンパイル単位でインスタンス化されないように、externテンプレート宣言を提供します。それが宣言されているヘッダーファイルを変更せずに、ヘッダーファイルで宣言されたテンプレート化されていないクラスに対しても同じことをする方法はありますか?テンプレート以外のクラスのインスタンス化を防止できますか?

モチベーションは、ブーストによるオブジェクトファイルの膨らみを減らすことです。これは、インライン展開が適用できない場合でも、ヘッダーにテンプレート化されていないクラスがかなり多く定義されています。

+1

なぜオブジェクトファイルのサイズは気になりますか?リンカーは、リンク中に同じシンボルをすべて削除する必要があります。 – ildjarn

+1

@ildjarn:同じシンボルを複数回コンパイルすると大きなプロジェクトで膨大なコンパイル時間が発生する可能性があります – Paranaix

+2

@Paranaix:この問題のようなハックを必要とせずにプリコンパイル済みヘッダーが処理します。 –

答えて

0

ほとんどの目的と目的のために、実際にはこれに関するいかなるトリックもありません。プリコンパイルされたヘッダーがトリックでない限り?依存関係をヘッダーから外す作業は、私が推奨するものです。

これらの種類の問題を解決しようとする私の経験は、通常プロジェクトが制御不能になっているというライブラリ依存関係の症状です。すべてが他のすべてに依存するので、すべてを含めないことは難しいです。したがって間違ったヘッダーを含めると、すべてに影響します。

あなたの依存関係を可視化し、それがDAGではない場合、それが最初の懸念事項です。

その後、問題の原因となっている特定のヘッダーを特定する方が簡単です。 pimpl idiomと事前宣言は、細目を修正するための優れたツールです。

私はブーストに関して一貫した問題を抱えていませんでしたが、ライブラリのいくつかはトラブルメーカーになる可能性があります。 boost::multi_indexは私がオフハンドと考えることができる唯一のものです。

関連する問題