Будет ли компилятор исключать неиспользуемый код шаблона?

Когда вы используете шаблон с многочисленными методами (такими как vector) и компилируете свой код, компилятор отбросит код из неиспользуемых методов?

4 ответа

Решение

Шаблон не создается, если он не используется, поэтому на самом деле нет кода, который нужно отбрасывать.

Стандарт гласит (14.7.1/10)

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

Поэтому, если вы можете избежать виртуализации функций-членов шаблона, компилятор не будет генерировать для них никакого кода (и это может сработать и для виртуальных функций, если компилятор достаточно умен).

Это зависит от вашего уровня оптимизации. При более высоких настройках оптимизации, да, скорее всего будет происходить удаление мертвого кода.

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

с помощью шаблонов код на самом деле не может быть изначально создан (если не создан).

конечно, не все из них будут удалены в каждом сценарии, однако (rtti - тихий убийца). Немного осторожности и тестирование с использованием настроек сборки может иметь большое значение, чтобы помочь вам уменьшить двоичный размер и мертвый код.

Умные компиляторы исключат это скорее всего. Я думаю, что давным-давно, когда я играл с Borland C++ Builder, он не выбрасывал неиспользуемые методы класса шаблонов. Не могу подтвердить, хотя

Другие вопросы по тегам