Улучшает ли специализация класса шаблона / явное создание экземпляров скорость компиляции / компоновщика? - PullRequest
2 голосов
/ 12 января 2011

Предположим, что следующий шаблонный класс интенсивно используется в проекте, в основном int , так как имя типа и скорость компоновщика заметно медленнее с момента появления этого класса.

template <typename T>
class MyClass
{
void Print()
{
    std::cout << m_tValue << std::endl;;
}
T m_tValue;
}

Будет определятьскорость компиляции преимущества специализации класса?например.

template <>
class MyClass<int>
{
void Print()
{
    std::cout << m_tValue << std::endl;;
}
int m_tValue;
}

Или явное создание экземпляра предлагает лучшее решение?например,

template class MyClass<int>;

Ответы [ 4 ]

2 голосов
/ 12 января 2011

в C ++ 0x вы сможете использовать внешние шаблоны, так что создание шаблонов происходит только один раз, как внешние переменные.

Это должно помочь во время компиляции, так как компилятору не нужно создавать экземпляршаблон с его аргументами каждый раз, когда он его видит.

Я еще не выяснил, как именно я буду использовать эту функцию в своих собственных проектах, но все, что может помочь во время компиляции, является плюсом для меня.

http://www2.research.att.com/~bs/C++0xFAQ.html#extern-templates

1 голос
/ 12 января 2011

Мы обнаружили, что шаблон может значительно увеличить время компиляции и ссылки.Одна из проблем заключается в том, что каждый файл, содержащий заголовок, объявляющий шаблон, должен будет проанализировать его, проверить его действительность, и, если он используется модулем компиляции, сгенерированный объектный файл будет содержать код, который впоследствии будет удаленкомпоновщик (если используется более чем одним файлом).

В нашем проекте у нас был какой-то большой шаблон, который был включен почти в каждый файл, но из которых когда-либо существовало только два экземпляра.Мы значительно улучшили время компиляции, используя явное создание экземпляров и разделение кода шаблона на несколько файлов.

Для вашего примера это даст вам:

// MyClass.h
template < typename T >
class MyClass
{
void Print();
T m_tValue;
}

// MyClass.inl
#ifdef MY_CLASS_METHODS_ARE_NOT_INLINE
#   define MY_CLASS_INLINE
#else
#   define MY_CLASS_INLINE inline
#endif

template < typename T >
MY_CLASS_INLINE void MyClass< T >::Print()
{
    std::cout << m_tValue << std::endl;
}

#undef MY_CLASS_INLINE

// MyClass.cpp
#include "MyClass.h"

#define MY_CLASS_METHODS_ARE_NOT_INLINE
#include "MyClass.inl"

template class MyClass< int >;
template void MyClass< int >::Print();

#undef  MY_CLASS_METHODS_ARE_NOT_INLINE
1 голос
/ 12 января 2011

Если сделать программу более сложной - более длинной и требующей устранения неоднозначности на сайте вызова - в общем, компилятор станет медленнее не быстрее.

Однако это маловероятнобыть большой проблемой, если вы автоматически не генерируете огромное количество таких специализаций.Кроме того, производительность зависит от компилятора - вы всегда можете протестировать его самостоятельно (я ожидаю, что разница будет слишком маленькой, чтобы быть очевидной без тщательных тестов и большого количества тестовых прогонов).

Возможно, скорость компоновщика снижается, так какшаблон объявляется как «встроенный» (хотя и не обязательно встроенный) во всех модулях компиляции, на которые он ссылается.Когда это происходит, вы дублируете метод повсюду, и компоновщик получает больше работы.Для сравнения, «нормальная» функция с простым объявлением в заголовке и определением в одном месте приведет к одной скомпилированной функции и, следовательно, к меньшему количеству функций для компоновщика (и компилятора).В зависимости от таких опций, как генерация кода во время компоновки, это может иметь незначительное значение или почти не иметь значения.

0 голосов
/ 12 января 2011

Это строго зависит от вашей цепочки инструментов (в данном случае по крайней мере компоновщик и компилятор, может быть, больше).

Просто попробуйте, но имейте в виду, что результаты могут сильно отличаться при изменении дажеодин кусок вашего набора инструментов.

...