私が取り組んでいる大規模なプロジェクトで.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)
答えて
std::vector
テンプレート(メンバーではなく、宣言する必要がある)を定義するインクルードヘッダーを作成し、vector
標準ヘッダーの代わりにインクルードヘッダーを含めることが唯一のことです。
次に、あなたが明示的にそのに対して別々のコンパイル単位とリンクでstd::vector<whatever>
をインスタンス化することができます。
明示的にちょうど次を使用し、(それが動作しません)extern template
を使用しない、テンプレートをインスタンス化するには:
#include <vector> // The standard header, not your forward-declaration!
template class std::vector<double>;
「extern template」が動作しないのはなぜですか? –
@quant_dev私が言ったことを忘れて、それはちょうどうまくいくかもしれません(しかしあなたの実験は、この場合はそうではないことを示唆しています)。そして再び、「extern」のないインスタンス化も同様です。 –
はい、テンプレートがメソッド定義をクラス定義に含まない場合に機能します。 –
あなたがvector
ヘッダーを変更したり、提供しない限り、それはおそらくそれを行うことはできませんその同値には宣言のみが含まれています。それ以外の場合は#include
ファイルvector
の内容がインクルードファイルに入り、コンパイルされ、最初にテンプレートがインスタンス化されます。リンカーは重複を除去します。 C++コンパイルがどのように機能するのか、ここでは何もできません。私はそれがコンパイラの最適化を達成するためのコードを畳み込むとしてハックを、検討する今示唆何
それはまったくそうではありません。テンプレートクラスにクラス定義内のメソッド定義が含まれていない場合は、クラス定義の後に 'extern template'宣言を追加することができ、コンパイラは' extern template'宣言を信頼して使用時にテンプレートをインスタンス化しません。私を得る方法のインライン展開です。 –
。これを試す前に、コンパイラのフラグを調査する必要があります。
は、すべてのOBJファイルに入れどのコンパイラすべてにコンパイラに依存しているが、私は、ベクターの専門を継承しようとすると、この専門を使用することをお勧めします。これは、コンパイラがベクトルの特殊化を含むobjファイルを作成し、ラップされたベクトルのすべてのユーザーがこれを代わりに使用できるようにすることを想像することができます。
私はそれをすることができました、ありがとう。 –
- 1. Visual Studio 2008 C#展開変数
- 2. Visual C#2008 Expressの展開
- 3. のVisual Studio 2008のデータベースプロジェクトの展開ベースライン
- 4. Visual Studio 2008の展開プロジェクトの問題?
- 5. Visual Studioのウォッチウィンドウで継承されたメンバーをC++で展開しますか?
- 6. visual studio 2008 sp1 std :: string :: c_str()エラー
- 7. インスタンス化されたオブジェクトをマウスで移動する(Visual Studio C#)
- 8. C#、Visual Studio 2008
- 9. Visual Studio 2008を使用したスマートデバイスへの展開
- 10. Visual Studioの展開を続ける
- 11. Visual Studioでのstd :: vectorサイズの初期化
- 12. C++のstd :: vectorをstd :: vector <unsigned char>に変換する
- 13. Visual Studio 2008/Visual C++ 2008 Expressを使用したCの学習
- 14. C++ - std :: vectorにオブジェクトを追加する、ループでインスタンス化する
- 15. エラー2664 - std :: vector <...>をstd :: tr1 :: shared_ptr
- 16. Visual Studio 2010で展開されたアプリケーションパッケージのコードを変更する方法は?
- 17. C#Visual Studio 2013抑制 'クラスはインスタンス化されません'
- 18. Visual Studio 2008 - 2つのプロジェクトをデバイスに展開
- 19. Visual Studio 2008でメソッドなどが表示されないC#コード
- 20. Visual Studio 2008のツールバー開発
- 21. Visual Studio 2008 - 反映されたコードをステップインする方法(F11)
- 22. Visual Studio for C++コードのコンパイルエラー
- 23. JITインライン展開で、自分のコードを.NETランタイムアセンブリコードにインライン展開できますか?
- 24. Visual Studio Excel 2007テンプレートを展開する
- 25. std :: vector <int>からchar [] C++
- 26. std :: vector <std::string>クラッシュ
- 27. スタティックコードアナライザー:アンマネージドC++ Visual Studio 2008
- 28. C#Visual StudioのWindowsフォームビジュアルコンポーネントはどこでインスタンス化されていますか?
- 29. Visual Studio 2008のスマートポインタ
- 30. 'std :: vector <std :: basic_string <char>> *'から 'const std :: vector <std :: basic_string <char>>&'
MicrosoftのC++コンパイラはいつから「extern template」をサポートしますか?私が知る限り、それは単に無視されます。 –
それはありません。私はVS 2008(SP1)で試してみました。 –