Является ли спецификатор "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 авто описатель
- автоматический спецификатор типа означает, что тип объявляемой переменной должен быть выведен из инициализатор или что Декларатор функции должен включать тип trailing-return.
- автоматический спецификатор типа может появиться с декларатором функции с типом трейлинг-возврата в любом контекст, в котором допустим такой Декларатор.
- в противном случае тип переменной выводится из его 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
ключевое слово привело к беспроигрышной ситуации для кодеров и разработчиков компиляторов.