Я использую Visual Studio 2012, и у него есть случаи, когда мы добавляли параметры шаблонов в класс «просто», чтобы ввести «точку шва», чтобы в модульном тесте мы могли заменить эти части на фиктивные объекты.
Как вы обычно вводите точки стыка в C ++: используя интерфейсы и / или смешивание на основе некоторых критериев с неявными интерфейсами, используя также параметры шаблонов? Одной из причин этого также является то, что при компиляции иногда одного файла C ++ (который включает файлы шаблонов, который может также включать другие шаблоны) получается генерируемый объектный файл, который занимает порядка 5-10 секунд на компьютере разработчика ,
Насколько я понимаю, VS-компилятор также не особенно быстро компилирует шаблоны и из-за модели включения шаблонов (вы фактически включаете определение шаблона в каждый файл, который использует его косвенно, и, возможно, создаете экземпляр этого шаблона каждый раз при изменении то, что не имеет ничего общего с этим шаблоном) могут возникнуть проблемы со временем компиляции (при выполнении инкрементной компиляции).
Каковы ваши способы обработки добавочного (и не только) времени компиляции при работе с шаблонами (помимо лучшего / более быстрого компилятора :-)).
Ответы:
Если параметры ваших шаблонов могут принимать только конечный (и небольшой) набор значений, вы можете переместить их определение в исходный файл и использовать явное создание экземпляров .
Например, в
aaa.h
вас только объявить функции шаблонаf
иg
:Предполагать
n
, шаблон параметр может быть только 1, 3, 6, иT
параметр шаблона может быть толькоint
,long
иvoid *
.Затем вы определяете их
aaa.cpp
следующим образом:Таким образом, компилятор создает экземпляр шаблона для заданных параметров при компиляции.
aaa.cpp
. При компиляции клиентского кода предполагается, что определения где-то существуют, и компоновщик позаботится об этом.Вы также можете явно создавать экземпляры шаблонных классов. Недостатком является то, что вы не можете использовать
f
илиg
с другими параметрами шаблона.результаты в
Я использовал эту технику в проекте, где несколько сложных классов зависели от небольшого (<10) набора целочисленных параметров шаблона, и это значительно сократило время компиляции (поскольку компилятору не приходилось анализировать определения сложных шаблонов при компиляции клиентского кода) , Конечно, вы можете получить меньшие улучшения, в зависимости от реального кода.
источник
Однажды я использовал странное решение для аналогичной проблемы: включение STL приводит к времени компиляции, например, несколько секунд на исходный файл - независимо от того, насколько он крошечный. Поэтому я включил все мои исходные файлы в один мастер-файл, и время компиляции для каждого файла почти не изменилось ... что означало ускорение в 20 раз, так как у меня был только один файл для компиляции.
Чтобы сохранить дизайн в чистоте, я продолжал поддерживать make-файл, но никогда не использовал его (за исключением проверки, что он все еще работает).
источник
Раньше мы выполняли большую задачу по созданию наших предварительно скомпилированных заголовков и предварительно скомпилированных шаблонов за одну ночь, и просто строили их на следующий день.
источник