преобразует ли C ++ автоматически значения const ints в значения с плавающей точкой?

StackOverflow https://stackoverflow.com/questions/1419963

Вопрос

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

float y = 123;
float x = 1 / y;

и

float y = 123.f;
float x = 1.f / y;

Я вижу некоторый код, который выполняет последнее, но я не уверен, что это для оптимизации или из соображений безопасности (т. Е. Просто убедитесь, что divide имеет значение с плавающей запятой, даже если y является значением int).

Я использую gcc (поскольку ответ может зависеть от конкретного компилятора).

Кроме того, были бы оценены любые указатели на список того, что компилятор может и не может оптимизировать в целом.Спасибо!

Это было полезно?

Решение

Да, компилятор выполнит преобразование автоматически.Ваши два блока кода идентичны.

Это не оптимизация.Отключение оптимизации не заставит компилятор включить преобразование int-to-float в исполняемый код, если только это не очень некачественная реализация.

Это тоже не для безопасности.Компилятор никогда ничего не делает "на всякий случай", если операнд окажется другого типа.Компилятор знает типы всего, что есть в вашем коде.Если вы измените тип переменной, все, что использует эту переменную, все равно будет перекомпилировано;компилятор не пытается сохранить все остальное нетронутым и просто обновляет измененные разделы.

Другие советы

Да, это определенно так, поэтому два фрагмента эквивалентны.Единственное, что имеет значение, - это тип переменной, которой вы присваиваете значение.

В число с плавающей точкой y=123 и значение с плавающей точкой y = 123.f случаи должны быть одинаковыми для большинства компиляторов, но число с плавающей точкой x=1/y и число с плавающей точкой x=1.f/y на самом деле будет генерировать разные результаты, если y является целым числом.

Это действительно зависит от компилятора - некоторые могут фактически хранить константу int и преобразовывать ее каждый раз, когда она присваивается переменной с плавающей точкой.

Бывают случаи, когда компилятор преобразует float в int, например

float f;
if (f > 1) ...

В этом случае у меня случилось так (Visual Studio 2008), что компилятор создал код, эквивалентный

if (int (f) > 1) ...
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top