Мальчик-Одуванчик wrote:
Рассмотрим обобщенную функцию с несколькими специализациями для разных типов входных параметров.
Стандарт гарантирует что в памяти займет место лишь код инстанцированных конкретным типом, а остальные будут отброшены.
К примеру:
template<typename T> void f(T t) { ......}; // обобщенная функция
template<> void f<char>(char c) { ... } // специализация для типа char
template<> void f(double d) { ....} // специализация для типа double
int main()
{
f<int>(1); // вызов обобщенной функции
f('a'); // вызов специализированной
}
f(double d) - будет отброшена на этапе компиляции и ее код не будет занимать место в памяти
Нет. Ни в коем случае.
Как только вы выполнили explicit specialization шаблона функции, вы фактически получили в результате обыкновенную
нешаблонную функцию, которая подчиняется ODR (One Definition Rule) "на общих основаниях", т.е. правилам для самых обычных нешаблонных функций. А именно: такая специализация должна быть определена
не более одного раза во всей программе. Т.е. определение такой специализации вы ни в коем случае не будете помещать в заголовочный файл (ибо сразу схлопочете нарушение ODR), а будете вынуждены поместить в некий один-единственный файл реализации, из которого эта специализация будет линковаться всюду, где она нужна. Т.е. для explicitly specialized шаблона функции все работает именно и строго точно так же, как и в случае с обычной функцией.
Таким образом в классической С++ архитектуре, основанной на принципе раздельной компиляции единиц трансляции, компилятор будет вынужден безусловно компилировать в объектный файл все ваши explicitly specialized шаблоны. У него просто нет выбора: компилятор не имеет ни малейшего представления о том, нужна или не нужна эта специализация в других единицах трансляции. Поэтому никакого обещанного вами отбрасывания ненужного кода на этапе компиляции он выполнить не может. Ваша `template<> void f(double d)` отброшена не будет, а будет честно включена компилятором в объектный файл.
О каком-то отбрасывании ненужного кода тут можно будет вести речь только на стадии линковки/глобальных оптимизацией (per-function linking и т.п.). Но это уже совсем другая история, к специализациям шаблонов никакого отношения не имеющая.
И, разумеется, никакой гарантии отбрасывания такого кода в стандарте языка нет.