Каковы недостатки использования шаблонов?

Некоторые недостатки были бы

  1. его синтаксис сложен
  2. компилятор генерирует дополнительный код
10
задан Josh Kelley 29 April 2010 в 17:19
поделиться

10 ответов

Их сложно проверить. Код шаблона, который не используется, обычно редко компилируется. Поэтому необходимо хорошее покрытие тестовых примеров. Но тестирование занимает много времени, и тогда может оказаться, что код вообще никогда не нуждался в надежности.

24
ответ дан 3 December 2019 в 13:11
поделиться

Хм, как насчет ...

3: Они могут медленно компилироваться

4: Они заставляют вещи вычисляться во время компиляции, а не во время выполнения (это также может быть преимуществом, если вы предпочитаете высокую скорость выполнения гибкости во время выполнения)

5: Старые компиляторы C ++ не обрабатывают их или не обрабатывают t обрабатывают их правильно

6: сообщения об ошибках, которые они генерируют, когда вы неправильно понимаете код, могут быть почти непонятными

22
ответ дан 3 December 2019 в 13:11
поделиться

Единственный реальный недостаток заключается в том, что если вы сделаете небольшую синтаксическую ошибку в шаблоне (особенно в шаблоне, который используется другими шаблонами), сообщения об ошибках не будут полезными ... ожидайте пару страниц сообщений об ошибках, которые почти невозможно использовать ;-) . Дефект компилятора очень специфичен для компилятора, и синтаксис, хотя и уродливый, на самом деле не является «сложным». В целом, однако, несмотря на огромную проблему с правильной диагностикой ошибок, шаблоны по-прежнему единственное лучшее в C ++, единственное, что может соблазнить вас использовать C ++ вместо других языков с более низкими реализациями. дженериков, таких как Java ...

10
ответ дан 3 December 2019 в 13:11
поделиться

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

12
ответ дан 3 December 2019 в 13:11
поделиться

Их сложно проанализировать компилятором, что означает увеличение времени компиляции. Также может быть сложно проанализировать сообщения об ошибках компилятора, если у вас есть расширенные конструкции шаблонов.

4
ответ дан 3 December 2019 в 13:11
поделиться

Меньше людей понимают их, особенно на уровне метапрограммирования, поэтому меньше людей могут их поддерживать.

3
ответ дан 3 December 2019 в 13:11
поделиться

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

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

1
ответ дан 3 December 2019 в 13:11
поделиться

Когда вы используете шаблоны, ваш компилятор генерирует только то, что вы действительно используете. Я не думаю, что есть какие-либо недостатки в использовании метапрограммирования шаблонов C ++, кроме времени компиляции, которое может быть довольно большим, если вы использовали очень сложные структуры, как это делают библиотеки boost или loki.

1
ответ дан 3 December 2019 в 13:11
поделиться

Пока что никто, кажется, не упомянул главный недостаток, который я обнаружил у шаблонов: читаемость кода резко падает!

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

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

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


Не связанная с этим проблема с шаблонами состоит в том, что отладчики все еще испытывают трудности с естественным отображением содержимого контейнеров STL (по сравнению, скажем, с массивами в стиле C).

10
ответ дан 3 December 2019 в 13:11
поделиться

Абсолютно худшее: ошибка компилятора. сообщения, которые вы получаете из-за неправильного кода шаблона.

1
ответ дан 3 December 2019 в 13:11
поделиться
Другие вопросы по тегам:

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