Делают ли С++ шаблоны медленными?

Я слышал от многих людей, что использование шаблонов делает код медленным. Это правда. В настоящее время я строю библиотеку. Есть места, где, если шаблоны не создаются, это приведет к проблемам с управлением кодом. На данный момент я могу представить два решения этой проблемы:

  • использовать #defines

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

например. typedef Graph<int> GraphI32; и т.д.

В любом случае, чтобы запретить пользователю создавать различные экземпляры шаблонов самостоятельно.

Помощь по вышеуказанным запросам будет высоко оценена.

Ответ 1

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

Изменить: Чтобы прояснить ситуацию в отношении размера кода: да, большинство компиляторов могут и будут складывать код для идентичных экземпляров, но обычно это случается, когда интенции действительно идентичны. Компилятор не будет вставлять код, чтобы делать даже самые тривиальные преобразования, чтобы использовать его в соответствии с существующим экземпляром. Например, обычный вызов функции может/будет преобразовывать T * в T const *, поэтому вызовы, использующие аргументы const или non const, будут использовать один и тот же код (если вы не решили перегрузить функцию на const ness, и в этом случае вы, вероятно, сделали это специально для обеспечения различного поведения для этих двух случаев). С шаблоном этого не произойдет - экземпляры над T * и T const * приведут к созданию двух совершенно отдельных фрагментов кода. Возможно, компилятор (или компоновщик) может объединить два после факта, но не полностью определен (например, я, конечно, использовал компиляторы, которые этого не сделали).

Шаблоны оказывают положительное влияние на скорость гораздо чаще, чем отрицательные.

Ответ 2

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

Ответ 3

Нет, они этого не делают. Когда вы обнаружите, что вы "что-то слышали" и не можете назвать источник, вы почти наверняка гарантируете, что то, что вы слышали, неверно. Фактически, шаблоны имеют тенденцию ускорять кодирование.

Вместо того, чтобы зависеть от слуха, рекомендуется прочитать авторитетную книгу по этому вопросу - рекомендую С++ Templates - The Complete Guide.

Ответ 4

Шаблон делает компиляцию медленной. Но большую часть времени программа ускоряется.

Ответ 5

Они делают объектный код больше, потому что С++ генерирует код для каждого используемого вами типа. Но я не верю, что это замедлит скорость выполнения. У меня нет цифр, чтобы предположить, что это произойдет.

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