Является ли спецификатор "auto" медленнее во время компиляции?

начиная с C++11, мы можем использовать auto a = 1+2 вместо int a = 1+2 и компилятор выводит тип a сам по себе. Как это работает? Это медленнее во время компиляции (больше операций), чем объявление типа самостоятельно?

3 ответов


auto запрашивает C++11 компилятор чтобы сделать ограниченный вид вывод типа (посмотри в вида OCaml если вы хотите более сексуальный язык вывода типа). Но накладные расходы-это только время компиляции.

если заменить auto a=1+2; С int a=1+2; (оба имеют одинаковое значение, см. ответ simplicis) и если вы попросите свой компилятор оптимизация (и, вероятно, даже не спрашивая для оптимизации) вы, вероятно, получите то же самое код. См. также этой.

при использовании GCC попробуйте скомпилировать небольшой C++11 С g++ -Wall -fverbose-asm -O -S foo.cc и посмотрите (с помощью редактора) в сгенерированный foo.s ассемблерного файла. Вы не увидите разницы в сгенерированном коде (но файл ассемблера может немного измениться, например, из-за метаданных, таких как отладочная информация и т. д.)

если вы обеспокоены медленное время компиляции я думаю, что с помощью auto не является решающим фактором (вероятно, перегрузка может быть более дорогостоящей во время компиляции). В C++11 почти предназначен для практически требуются большое оптимизация (в частности, сложная вставка и постоянное сворачивание и устранение мертвого кода), а его "разбор" (в частности, включение заголовка и расширение шаблона) является дорогостоящим.

предварительная компиляция заголовков и параллельные сборки с make -j (и, возможно,ccache или distcc) может помочь в улучшении общего времени компиляции, намного больше, чем отказ auto.

и если вы хотите систематически избегать auto (в частности


компилятор знает введите выражение (например,1 + 2) возвращает. Именно так работает язык - оба операнда имеют тип int таким образом int как хорошо. С auto a, вы просто говорите компилятору "использовать тип инициализирующего выражения".

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


на auto ключевое слово действительно вступает в свои права с итераторами:

std::vector< std::string >::const_iterator it = foo.cbegin();

и

auto it = foo.cbegin();

Как работает:

С ISO / IEC:

...Авто описатель-это тип, чтобы быть выведено (7.1.6.4). Другие спецификаторы простого типа указывают либо ранее объявленный определяемый пользователем тип, либо один из основных типов...

7.1.6.4 авто описатель

  1. автоматический спецификатор типа означает, что тип объявляемой переменной должен быть выведен из инициализатор или что Декларатор функции должен включать тип trailing-return.
  2. автоматический спецификатор типа может появиться с декларатором функции с типом трейлинг-возврата в любом контекст, в котором допустим такой Декларатор.
  3. в противном случае тип переменной выводится из его initializer. Имя объявляемой переменной не должно отображаться в выражении инициализатора. Это использование auto разрешено при объявлении переменных в блок, в область пространства имен и в инструкции for-init; auto должен отображаться как один из спецификаторов decl в спецификаторе decl-seq, а за спецификатором decl-seq должен следовать один или несколько initdeclarators, каждый из которых должен иметь непустой инициализатор...

пример:

auto x = 5; // OK: x has type int
const auto *v = &x, u = 6; // OK: v has type const int*, u has type const int
static auto y = 0.0; // OK: y has type double
auto int r; // error: auto is not a storage-class-specifier

это быстрее:

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

в одном из интервью, Бьерн Страуструп, он сказал, что auto ключевое слово привело к беспроигрышной ситуации для кодеров и разработчиков компиляторов.