С++ 11 время компиляции или время выполнения?

auto a = 10;

Когда компилятор знает a is int, во время компиляции или во время выполнения? Если он выводит тип во время выполнения, это не повлияет на производительность?

Спасибо

Ответ 1

Время компиляции. В С++ информация о типе времени во время компиляции удаляется (без RTTI или виртуального наследования). На самом деле невозможно проверить примитивный тип во время выполнения.

Ответ 2

Я просто хотел добавить некоторые вещи, которые не отвечали на другие ответы.

  • каждое объявление должно иметь известный тип во время компиляции, поэтому auto не получает специального лечения, оно должно выводить тип во время компиляции.
  • Вы как-то неправильно интерпретируете, как следует использовать auto. Да, вы можете сделать auto i = 2;, и он отлично работает. Но ситуация, когда вам нужно авто, - это, например, лямбда. Лямбда не имеет именного типа (хотя вы можете назначить его std::function). Другая ситуация, в которой это полезно, находится внутри шаблона класса или функции, чрезвычайно сложно определить тип определенных операций (возможно, иногда это невозможно), например, когда функция вызывается в типе шаблона, функция может возвращать что-то другое в зависимости по типу данного, с несколькими типами, это может стать практически невозможным для определения того, какой тип он вернет. Вы могли бы, конечно, просто обернуть функцию в decltype, чтобы выяснить возвращение, но auto гораздо чище писать.
  • Люди также, похоже, используют авто довольно много для итераторов, потому что их типы довольно больно писать, но я не уверен, что это предназначенное основное использование auto

Ответ 3

Выполняется полностью во время компиляции без каких-либо различий в производительности.

auto i = 2;

компилируется так же, как

int i = 2;

Ответ 4

Тип объявленной переменной auto выполняется во время компиляции, что означает, что у вас есть следующий фрагмент кода:

auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3

Herb Sutter (Парень, отвечающий за комитет по стандартизации С++) рекомендует "Использовать авто везде, где это возможно". Это полезно по двум причинам. Во-первых, наиболее очевидно, что это удобство, позволяющее избежать повторения имени типа, которое мы уже и компилятор уже знает. Во-вторых, это больше, чем просто удобство, когда тип имеет неизвестное или невыразимое имя, такое как тип большинства лямбда-функций, которые вы не могли бы иначе легко или просто ". (см. эту статью в своем блоге). Предполагаемое использование auto заключается в том, чтобы упростить работу с разработчиком, поэтому не стесняйтесь использовать его всякий раз, когда он кажется подходящим.