0

我有一个 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.obj 文件Foo::foo< int >(),但它似乎不会影响 main.obj 的大小。

这种技术是否可以减少模板代码的编译时间?或者它实际上增加了编译时间,因为Foo::foo< int >()现在必须编译两次?

谢谢

4

3 回答 3

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;
}
于 2012-06-14T14:39:50.700 回答
0

从功能上讲,没有区别。foo.cpp仅包含声明(无定义)。如果包含foo.cpp在编译中,则编译时间会增加。

于 2012-06-14T14:17:09.237 回答
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;
}
于 2012-06-14T14:38:10.273 回答