2012-01-24 4 views
5

私が取り組んでいる大規模なプロジェクトで.objファイルのサイズを小さくしたいのです(私はリンカが重複した定義を削除することを知っていますが、ビルドプロセスをスピードアップしたいと思います)。そのサイズの理由の1つは、std::vector<double>またはstd::vector<std::string>を使用する各クラスがこのクラスのコードをコンパイルし、.objファイルに配置することです。 std::vector<double>を明示的にインスタンス化しようとしましたが、extern template宣言を使用しましたが、動作しません - std::vector in Visual Studio C++ STLにはすべてのメソッドがインラインになっています。 STLコードを修正するのは短期間ですが、コンパイラにインラインでインスタンス化されたメソッドを強制しないで、std::vector<double>の外部インスタンス化バージョンを使用する方法はありますか?explcitlyインスタンス化されたstd :: vector <T>コードのインライン展開を避けますか? (Visual Studio C++ 2008)

+0

MicrosoftのC++コンパイラはいつから「extern template」をサポートしますか?私が知る限り、それは単に無視されます。 –

+0

それはありません。私はVS 2008(SP1)で試してみました。 –

答えて

2

std::vectorテンプレート(メンバーではなく、宣言する必要がある)を定義するインクルードヘッダーを作成し、vector標準ヘッダーの代わりにインクルードヘッダーを含めることが唯一のことです。

次に、あなたが明示的にそのに対して別々のコンパイル単位とリンクでstd::vector<whatever>をインスタンス化することができます。

明示的にちょうど次を使用し、(それが動作しません)extern templateを使用しない、テンプレートをインスタンス化するには:

#include <vector> // The standard header, not your forward-declaration! 

template class std::vector<double>; 
+0

「extern template」が動作しないのはなぜですか? –

+0

@quant_dev私が言ったことを忘れて、それはちょうどうまくいくかもしれません(しかしあなたの実験は、この場合はそうではないことを示唆しています)。そして再び、「extern」のないインスタンス化も同様です。 –

+0

はい、テンプレートがメソッド定義をクラス定義に含まない場合に機能します。 –

-1

あなたがvectorヘッダーを変更したり、提供しない限り、それはおそらくそれを行うことはできませんその同値には宣言のみが含まれています。それ以外の場合は#includeファイルvectorの内容がインクルードファイルに入り、コンパイルされ、最初にテンプレートがインスタンス化されます。リンカーは重複を除去します。 C++コンパイルがどのように機能するのか、ここでは何もできません。私はそれがコンパイラの最適化を達成するためのコードを畳み込むとしてハックを、検討する今示唆何

+0

それはまったくそうではありません。テンプレートクラスにクラス定義内のメソッド定義が含まれていない場合は、クラス定義の後に 'extern template'宣言を追加することができ、コンパイラは' extern template'宣言を信頼して使用時にテンプレートをインスタンス化しません。私を得る方法のインライン展開です。 –

1

。これを試す前に、コンパイラのフラグを調査する必要があります。

は、すべてのOBJファイルに入れどのコンパイラすべてにコンパイラに依存しているが、私は、ベクターの専門を継承しようとすると、この専門を使用することをお勧めします。これは、コンパイラがベクトルの特殊化を含むobjファイルを作成し、ラップされたベクトルのすべてのユーザーがこれを代わりに使用できるようにすることを想像することができます。

+0

私はそれをすることができました、ありがとう。 –

関連する問題