对于基于模板的类(STL 和 boost),不使用源文件并将实现也放入头文件似乎是一种常见的约定。我认为与头文件和源文件中声明和实现之间的经典分离相比,这将大大增加编译包含头文件的源文件所需的时间。这样做的原因可能是因为您必须在源文件中告诉编译器要使用哪些模板,这可能会导致 .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>;