Шаблоны c ++ делают программы медленными? - PullRequest
34 голосов
/ 14 марта 2010

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

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

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

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

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

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

Ответы [ 5 ]

53 голосов
/ 14 марта 2010

Короткий ответ - нет.Для более длинного ответа, пожалуйста, читайте дальше.

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

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

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

20 голосов
/ 14 марта 2010

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

14 голосов
/ 14 марта 2010

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

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

7 голосов
/ 14 марта 2010

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

6 голосов
/ 14 марта 2010

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

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

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