Влияние авто на время компиляции
Новое ключевое слово auto, которое мы получили в C++11, выглядит для меня довольно шаблонно, поэтому мой вопрос - повлечет ли это такое же раздувание времени компиляции, как шаблоны?
Тот же вопрос в отношении полиморфных лямбд:
[](auto val) {...}
по сути это лямбда-шаблон - это повлияет на время компиляции или нет?
2 ответа
auto
Ключевое слово C++11 гораздо менее тяжелое, чем шаблоны - его "накладные расходы" во время компиляции сопоставимы с sizeof
, что означает, что это близко к нулю.
В отличие от шаблонов, где компилятору необходимо выполнять значительный объем вычислений во время расширения (язык шаблонов в C++ является тьюрингово-полным), auto
Ключевое слово требует, чтобы компилятор выяснил тип выражения, что компилятор все равно знает. На самом деле, он должен был бы выяснить тип выражения даже без auto
ключевое слово, чтобы решить, нужно ли применять преобразования типов.
То, что большинство людей подразумевает под "раздутием шаблона", является мифом. Созданный дважды шаблон создает не больше кода, чем две отдельные функции, которые обрабатывают те же типы. Если вы создадите экземпляр шаблона тысячи раз, вы получите много кода, но если вы напишите тысячи функций, вы получите то же количество кода (см. Шаблоны диет для некоторых подлинных способов, когда небрежное определение шаблонов может привести к некоторому "раздутию")..) Шаблоны могут влиять на время компиляции, но это не "раздувание".
auto
Ключевое слово не является шаблоном, оно использует те же правила вывода типов, что и шаблоны, но если вы пишете auto i = 1;
есть только одна "реализация", то есть auto
должен только выводить один тип, и он производит точно такой же код, как int i = 1;
так что не может быть никакого раздувания. Это просто альтернативный синтаксис для объявления переменной. Ноль вздутие живота.
Теперь полиморфные лямбды разные, они определяют тип с помощью шаблона функции-члена operator()
поэтому каждый раз, когда вы звоните operator()
с разными типами аргументов вы создадите другую специализацию шаблона функции, но это не имеет ничего общего с auto
, использование auto
это просто синтаксис для объявления шаблона. Если вы вызываете его тысячи раз, вы получите много сгенерированного кода, но не больше, чем если бы вы использовали тысячи различных лямбда-выражений для конкретных типов, которые вы используете (вы почти наверняка получите меньше кода с помощью общей лямбды, потому что есть только одно замыкание введите так меньше RTTI и введите имена для компилятора, чтобы создать и сохранить в памяти.)