Шаблоны C++ делают программы медленными?

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

  • используйте #defines

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

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

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

Справка на вышеупомянутых запросах высоко ценилась бы.

36
задан Tadeusz A. Kadłubowski 14 March 2010 в 14:27
поделиться

5 ответов

Короткий ответ - нет. Чтобы получить более подробный ответ, продолжайте читать.

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

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

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

57
ответ дан 27 November 2019 в 05:20
поделиться

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

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

6
ответ дан 27 November 2019 в 05:20
поделиться

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

7
ответ дан 27 November 2019 в 05:20
поделиться

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

20
ответ дан 27 November 2019 в 05:20
поделиться

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

Вместо того, чтобы полагаться на слух, лучше прочитать авторитетную книгу по этой теме - я рекомендую Шаблоны C ++ - Полное руководство .

14
ответ дан 27 November 2019 в 05:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: