Шаблоны не обязательно ведут к раздуванию кода.Если вы напишите шаблон функции или класса и создадите его для десятка различных типов, тогда да, вы получите много сгенерированного дублированного кода (возможно, в любом случае. Некоторые компиляторы могут объединять идентичные экземпляры обратно).
Но еслишаблон создается только для одного типа, тогда в размере кода стоит ноль .Если вы создадите его пару раз, вы заплатите определенную стоимость, но в конечном итоге вы заплатите, если воспользуетесь каким-либо другим способом для достижения того же результата.Динамический полиморфизм (виртуальные функции и наследование) тоже не бесплатен.Вы платите за это с точки зрения vtables, кода, сгенерированного для облегчения всех необходимых типов преобразования и преобразования, и просто из-за кода, который нельзя встроить или оптимизировать.
Взяв в качестве примера std::vector
,тогда да, если вы используете vector<int>
и vector<float>
, вы получите две копии некоторого кода.Но с шаблонами компилируется только код, который на самом деле используется .Функции-члены, которые вы никогда не вызываете, не будут генерировать никакого кода, и даже в функциях, которые скомпилированы, компилятор может удалить много кода.Например, для некоторых типов код обработки исключений может быть ненужным, поэтому компилятор может его исключить, получая меньший код, чем если бы вы использовали динамический полиморфизм, когда компилятор не смог бы создать любые предположения о типе хранимых.Таким образом, в этом вымышленном примере вы получите некоторый код, сгенерированный как для vector<int>
, так и vector<float>
, но каждый из них будет намного меньше, чем полиморфный вектор, как вы могли бы найтив Java, например.
Основная проблема с использованием шаблонов заключается в том, что для этого требуется компилятор, который его поддерживает.На ПК это не проблема.На любой другой платформе, в которой имеется зрелый компилятор C ++, это не проблема.
Но не на всех платформах доступен современный сверхпрочный компилятор C ++.Некоторые не поддерживают ряд расширенных функций, а некоторые просто недостаточно хороши для оптимизации, необходимой для работы кода шаблона (например, шаблоны требуют большого количества вставок).Поэтому на некоторых платформах лучше избегать шаблонов.Не из-за каких-либо проблем с размером кода, а потому, что компилятор может не справиться с этим.