Будет ли компилятор исключать неиспользуемый код шаблона?
Когда вы используете шаблон с многочисленными методами (такими как vector) и компилируете свой код, компилятор отбросит код из неиспользуемых методов?
4 ответа
Шаблон не создается, если он не используется, поэтому на самом деле нет кода, который нужно отбрасывать.
Стандарт гласит (14.7.1/10)
Реализация не должна неявно создавать экземпляр шаблона функции, шаблона элемента, не виртуальной функции-члена, класса-члена или статического члена данных шаблона класса, который не требует создания экземпляра. Не определено, будет ли реализация неявно создавать экземпляр виртуальной функции-члена шаблона класса, если в противном случае функция виртуального члена не была бы создана. Использование специализации шаблона в аргументе по умолчанию не должно приводить к неявному созданию экземпляра шаблона, за исключением того, что может быть создан экземпляр шаблона класса, если его полный тип необходим для определения правильности аргумента по умолчанию. Использование аргумента по умолчанию в вызове функции вызывает неявное создание специализаций в аргументе по умолчанию.
Поэтому, если вы можете избежать виртуализации функций-членов шаблона, компилятор не будет генерировать для них никакого кода (и это может сработать и для виртуальных функций, если компилятор достаточно умен).
Это зависит от вашего уровня оптимизации. При более высоких настройках оптимизации, да, скорее всего будет происходить удаление мертвого кода.
Компилятор, оптимизаторы и компоновщик могут опустить и / или уменьшить эту информацию. каждый зрелый инструмент, скорее всего, имеет параметры, специфичные для устранения мертвого кода
с помощью шаблонов код на самом деле не может быть изначально создан (если не создан).
конечно, не все из них будут удалены в каждом сценарии, однако (rtti - тихий убийца). Немного осторожности и тестирование с использованием настроек сборки может иметь большое значение, чтобы помочь вам уменьшить двоичный размер и мертвый код.
Умные компиляторы исключат это скорее всего. Я думаю, что давным-давно, когда я играл с Borland C++ Builder, он не выбрасывал неиспользуемые методы класса шаблонов. Не могу подтвердить, хотя