我有一个Visual Studio 2008 c ++ 03项目,我遇到过这样的事情:
//foo.hpp
namespace Foo {
template< typename T >
inline void foo( T t )
{
// do stuff...
};
}; // namespace foo
// foo.cpp
#include "foo.hpp"
namepsace Foo {
template void foo< int >();
}; // namespace Foo
//main.cpp
#include "foo.hpp"
int main(void)
{
int a = 5;
Foo::foo(a);
return 0;
}
这会创建一个我认为包含Foo::foo< int >()
的foo.obj文件,但它似乎不会影响main.obj的大小。
这种技术是否可以减少模板代码的编译时间?或者它实际上是在增加编译时间,因为现在必须编译Foo::foo< int >()
两次?
由于
答案 0 :(得分:2)
如果您不关心函数的内联(编译器可能会覆盖该函数),您可以执行以下操作。它不会是完美的,但你将有机会改善编译时间。
//foo.hpp
namespace Foo {
template< typename T >
void foo( T t );
}; // namespace foo
// foo.cpp
#include "foo.hpp"
namespace Foo {
template< typename T >
inline void foo( T t )
{
// do stuff...
};
}; // namespace foo
namespace Foo {
template void foo< int >();
}; // namespace Foo
//main.cpp
#include "foo.hpp"
int main(void)
{
int a = 5;
Foo::foo(a);
return 0;
}
答案 1 :(得分:0)
从功能上讲,没有区别。 foo.cpp
仅包含声明(无定义)。如果在编译中包含foo.cpp
,则编译时间会增加。
答案 2 :(得分:0)
简短回答否。 要提高编译速度,您应该这样做:
//foo.hpp
namespace Foo {
template <typename T> void foo( T t );
template <> void foo<int>(int t);
}; // namespace foo
// foo.cpp
#include "foo.hpp"
namepsace Foo {
template <> void foo<int>(int t)
{
// do stuff...
};
}; // namespace Foo
//main.cpp
#include "foo.hpp"
int main(void)
{
int a = 5;
Foo::foo(a);
return 0;
}