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

Эффект авто во время компиляции

Новое ключевое слово auto, которое мы получили на С++ 11, выглядит для меня темплатным, так что мой вопрос: будет ли он зависеть от того же времени компиляции, что и шаблоны?

Тот же вопрос в отношении полиморфных лямбда:

 [](auto val) {...}

это по существу шаблон лямбда - будет ли это повлиять на время компиляции или нет?

4b9b3361

Ответ 1

Ключевое слово auto для С++ 11 намного менее тяжелое, чем шаблоны - его служебные данные времени компиляции сопоставимы с его значением sizeof, что означает, что он близок к нулю.

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

Ответ 2

То, что большинство людей подразумевает под "шаблоном раздувания", - это миф. Шаблон, созданный дважды, создает no больше кода, чем две отдельные функции, которые обрабатывают те же самые типы. Если вы создаете экземпляр шаблона тысячи раз, вы получите много кода, но если вы напишете тысячи функций, вы получите одинаковое количество кода (см. Diet Шаблоны для некоторых подлинных способов небрежно определяющих шаблонов могут привести к некоторому "раздуванию".) Шаблоны могут влиять на время компиляции, но это не "раздувание".

Ключевым словом auto является не шаблон, он использует те же правила вывода типа, что и шаблоны, но если вы пишете auto i = 1;, существует только один "экземпляр", т.е. auto нужно только вывести один тип, и он выражает точно такой же код, что и int i = 1;, поэтому не может быть никакого раздувания. Это просто альтернативный синтаксис для объявления переменной. Нулевое раздувание.

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