2012-06-14 3 views
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>() теперь должен быть скомпилирован дважды?

Thanks

+3

Кажется бессмысленным, поскольку функция 'inline' –

ответ

0

Функционально нет никакой разницы. foo.cpp содержит только декларацию (без определения). Время компиляции увеличивается, если вы включите foo.cpp в компиляцию.

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; 
} 
+0

Я не понимаю, почему вы чувствуете необходимость добавить«ехЬегп шаблона»заявление. –

+0

спасибо. исправлено это – inkooboo

+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; 
} 
+0

+1 для «как это сделать правильно». – PaulH