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ファイルが作成されますが、main.objFoo::foo< int >()のサイズには影響しないようです。

この手法は、テンプレートコードのコンパイル時間を短縮するために機能しますか?それとも、2回コンパイルする必要があるため、実際にはコンパイル時間が長く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 に答える