这是否可以减少免费模板功能的编译时间?

时间:2012-06-14 14:10:52

标签: c++ templates compile-time

我有一个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 >()两次?

由于

3 个答案:

答案 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;
}