テンプレートベースのクラス(STLおよびブースト)にソースファイルを使用せず、実装をヘッダーに配置することも一般的な慣習のようです。これにより、ヘッダーとソースファイルでの宣言と実装の従来の分離と比較して、ヘッダーを含むソースファイルのコンパイルにかかる時間が大幅に増えると思います。これが行われる理由は、おそらく、ソースファイルでコンパイラに使用するテンプレートを指示する必要があるためです。これにより、.aファイルが肥大化する可能性があります。
ライブラリが大きくなるにつれてリンカーもより多くの時間を必要とすると仮定すると、ライブラリヘッダーを含むソースファイルのコンパイルにかかる時間の観点から、どちらのアプローチがより高速になりますか?
1. .cppファイルを使用せず、実装を含むクラス全体をヘッダーに配置します
//foo.hpp
template <class T>
class Foo
{
public:
Foo(){};
T bar()
{
T* t = NULL;
//do stuff
return *t;
}
};
また
2.ライブラリ自体のソースファイル内でさまざまなタイプのテンプレートを明示的にコンパイルします
//foo.h
template <class T>
class Foo
{
public:
Foo(){};
T bar();
};
//foo.cpp
template <class T>
T Foo<T>::bar()
{
T* t = NULL;
//do stuff
return *t;
}
template class Foo<int>;
template class Foo<float>;
template class Foo<double>;
template class Foo<long long>;