шаблон и исполняемый файл - PullRequest
3 голосов
/ 12 августа 2011

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

Извините за вопрос, я просто немного знаю о шаблоне.

Ответы [ 3 ]

5 голосов
/ 12 августа 2011

C ++ работает по принципу:
Вы платите за то, что используете .
Шаблон кода создает двоичные файлы только для кода, который вы используете / Instantiate.

То, что вы компилируете против стандартной библиотеки, содержащей сотни контейнеров STL, не означает, что ваш объектный код включает в себя все из них, а только те, которые вы используете.

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

3 голосов
/ 12 августа 2011

Сам шаблон не занимает места вообще.Это экземпляры этого шаблона, которые делают.Шаблон создается после того, как вы используете его с параметром типа - MyClass<int> mc.Инстанциация создается один раз для каждого используемого вами типа, поэтому MyClass<int> mc2 не вызовет другую инстанциацию, а скорее использует существующую.

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

0 голосов
/ 12 августа 2011

В дополнение к ответам, данным @Als и @eran:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...