Подтвердить что ты не робот

Когда на практике возникает раздувание шаблона?

Кажется, что в С++ и D языки, которые статически скомпилированы и в которых метапрограммирование шаблонов является популярным методом, вызывает приличную озабоченность по поводу раздувания шаблона шаблона. Мне кажется, что это в основном теоретическая проблема, за исключением встроенных систем с ограниченными ресурсами. Вне встроенного пространства мне еще предстоит услышать пример того, кто-то может продемонстрировать, что это была проблема на практике.

Может ли кто-нибудь представить пример вне встроенных систем с ограниченным объемом ресурсов, где на практике разрастание шаблона было на практике и имело <сильные > измеримые, практически значимые негативные эффекты?

4b9b3361

Ответ 1

В С++ мало проблем, потому что количество материалов шаблона, которое вы можете сделать на С++, ограничено их сложностью.

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

Теперь это лучше. Но в целом шаблоны по-прежнему вызывают много раздува по простой причине - они анализируют быстрее и более мощные, чем на С++, поэтому люди естественно используют их намного больше (даже в тех случаях, когда технически не нужны шаблоны). Должен признаться, что я один из главных преступников здесь (посмотрите, пожалуйста, tools.base, если хотите, но обязательно сохраните barf сумка удобная - файл фактически 90% -ный код шаблона).

Ответ 2

Template bloat НЕ проблема (это проблема с психикой, а не проблема с кодом).

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

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

Ответ 3

Я думаю, вам нужно будет найти более старый компилятор, чтобы увидеть раздувание кода шаблона на практике. Современные компиляторы С++ (и компоновщики) смогли некоторое время оптимизировать его.

Ответ 4

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

Ответ 5

Расплывчатость шаблона шаблона - это на практике, потому что он может увеличивать (много!!!) компилировать и связывать время.

Я лично думаю, что проблема С++ # 1 - это время компиляции, и в основном это связано с шаблоном.

Я работал над проектом с примерно 50 библиотеками. У нас была собственная система rtti с использованием шаблонов. Мне пришлось переписать из-за шаблона раздувания

Вот некоторые цифры:

  • libs отправился с 640 мегабайт до 420 мегабайт
  • темп пошел от 4,3 ГБ до 2,9 ГБ.
  • полная перестройка началась с 19:30 до 13:10.