auto a = 10;
Когда компилятор знает a
is int
, во время компиляции или во время выполнения? Если он выводит тип во время выполнения, это не повлияет на производительность?
Спасибо
auto a = 10;
Когда компилятор знает a
is int
, во время компиляции или во время выполнения? Если он выводит тип во время выполнения, это не повлияет на производительность?
Спасибо
Время компиляции. В С++ информация о типе времени во время компиляции удаляется (без RTTI или виртуального наследования). На самом деле невозможно проверить примитивный тип во время выполнения.
Я просто хотел добавить некоторые вещи, которые не отвечали на другие ответы.
auto
не получает специального лечения, оно должно выводить тип во время компиляции.auto
. Да, вы можете сделать auto i = 2;
, и он отлично работает. Но ситуация, когда вам нужно авто, - это, например, лямбда. Лямбда не имеет именного типа (хотя вы можете назначить его std::function
). Другая ситуация, в которой это полезно, находится внутри шаблона класса или функции, чрезвычайно сложно определить тип определенных операций (возможно, иногда это невозможно), например, когда функция вызывается в типе шаблона, функция может возвращать что-то другое в зависимости по типу данного, с несколькими типами, это может стать практически невозможным для определения того, какой тип он вернет. Вы могли бы, конечно, просто обернуть функцию в decltype
, чтобы выяснить возвращение, но auto
гораздо чище писать.auto
Выполняется полностью во время компиляции без каких-либо различий в производительности.
auto i = 2;
компилируется так же, как
int i = 2;
Тип объявленной переменной auto
выполняется во время компиляции, что означает, что у вас есть следующий фрагмент кода:
auto i = 10; // i is an integer
i = 3.14; // i is still an integer, will truncate to 3
Herb Sutter (Парень, отвечающий за комитет по стандартизации С++) рекомендует "Использовать авто везде, где это возможно". Это полезно по двум причинам. Во-первых, наиболее очевидно, что это удобство, позволяющее избежать повторения имени типа, которое мы уже и компилятор уже знает. Во-вторых, это больше, чем просто удобство, когда тип имеет неизвестное или невыразимое имя, такое как тип большинства лямбда-функций, которые вы не могли бы иначе легко или просто ". (см. эту статью в своем блоге). Предполагаемое использование auto
заключается в том, чтобы упростить работу с разработчиком, поэтому не стесняйтесь использовать его всякий раз, когда он кажется подходящим.