2013-07-07 3 views
12

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

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

[](auto val) {...} 

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

+6

Это не шаблон, это всего лишь вывод типа. –

+0

Использование 'auto' в качестве типа параметра даже не компилируется, не так ли? – Jason

+2

Это когда-нибудь C++ 14 просмотров – Zeks

ответ

17

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

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

+11

Полиморфные лямбды, как показано в вопросе, фактически будут генерировать 'template operator() (_ Без имени). – Xeo

+0

@Xeo Я пока не знаю много о полиморфных лямбдах. Думаю, мне нужно их прочитать. Хотел бы я попробовать, хотя я понимаю, что пока нет публично доступной реализации. – dasblinkenlight

+1

Эталонная реализация общедоступна: http://faisalv.github.io/clang-glambda/ –

12

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

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

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

+0

«Шаблон, созданный дважды, не создает больше кода, чем две отдельные функции, которые обрабатывают те же самые типы». Вообще-то, я думаю, что это _означно, на что ссылается шаблонный вздутие. В C обычно применяется преобразование к заданному типу, а затем только одно тело. шаблоны _must_ имеют один тип тела для каждого типа, даже если типы очень похожи (или даже идентичны) –

+0

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

+1

@MooingDuck, то вы сравниваете яблоки и апельсины. Если бы функции были «inline», это было бы справедливое сравнение. Во всяком случае, существует _is_ отрицательное влияние на время компиляции для каждого нового экземпляра шаблона, это связано не только с кодом в заголовках. Создание шаблонов для компилятора дорого. –

Смежные вопросы