C ++ автоматически приводит константные числа к плавающим? - PullRequest
0 голосов
/ 14 сентября 2009

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

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

и

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 14 сентября 2009

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

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

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

0 голосов
/ 14 сентября 2009

Есть случаи, когда компилятор переводит значения с плавающей точкой в ​​int, например,

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

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

if (int (f) > 1) ...
0 голосов
/ 14 сентября 2009

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

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

0 голосов
/ 14 сентября 2009

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

...