Ответ 1
Первое, что дает понять, в чем смысл вопроса. Если вопрос заключается в том, будут ли объекты типа более крупными (т.е. sizeof(T<int>) > sizeof(T_int)
), тогда ответ будет отрицательным. Если вопрос касается бинарного следа самого приложения, в том числе кода для функций, то ответ заключается в том, что общий размер программы может фактически быть меньше в случае шаблона, поскольку будут использоваться только используемые функции-члены ( если явно не инстанцировано). Хотя в конце дня компоновщик может также отбросить неиспользуемые элементы из версии без шаблонов.
Существует общий термин: раздувание кода, которое используется для обозначения взрыва кода, сгенерированного шаблонами. Термин относится к тому факту, что каждое различное создание шаблона будет генерировать свои собственные функции, и это может привести к тому, что в исполняемом файле будет присутствовать больше функций, чем с меньшим набором функций без шаблона, для которых допускаются преобразования аргументов.
Рассмотрим возможный интерфейс для векторного шаблона:
template <typename T>
class Vector {
template <typename U> void push_back(U u);
//....
Для каждого вызова push_back
с другим типом аргумента будет создана новая функция, поэтому для Vector<int>::push_back('a')
будет существовать функция, а другая для Vector<int>::push_back(1)
. Сравните это с интерфейсом std::vector
, в котором функция-член не является шаблоном, а вызывающий выполняет преобразование типа.
Хотя это может быть источником больших исполняемых файлов, я не считаю, что это то, о чем просили. В частности, для шаблонизированного типа и эквивалентного типа без шаблона, созданного вручную для конкретного экземпляра, генерируемый код должен быть эквивалентным (игнорируя тот факт, что искаженные имена имеют тенденцию быть больше для шаблонов:))