Вопрос про инициализацию стандартных типов. Например:
float fl_val;
fl_val = 1.0f;
fl_val = 1.0;
fl_val = 1;
Здесь мы инициализируем float разными значениями. Понимают ли сейчас компиляторы (например, GCC и Visual Studio), что происходит, и оптимизируют эти моменты? Например, сразу приводят к float на этапе компиляции, а не во время выполнения: сначала int(1) приводят к (1.0f). Затраты небольшие, но есть.
Вопрос с условием такого типа:
int a; // пусть она инициализирована неизвестным значением
int b = a >= 0 ? 1 : 2 * 10;
* 10 относится только к условию false, или к true тоже? Проверить сейчас возможности нет.
Ответ
1) Да, компиляторы уже давно очень-очень умные в плане оптимизации. Они прекрасно оптимизируют все константы, до которых могут дотянуться. Вот вам пример с gcc: вот такая функция
#include
void f()
{
float f = 4;
printf("%f", f);
}
компилируется в следующее:
.LC1:
.string "%f"
f():
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl .LC0(%rip), %eax
movl %eax, -4(%rbp)
cvtss2sd -4(%rbp), %xmm0
movl $.LC1, %edi
movl $1, %eax
call printf
leave
ret
.LC0:
.long 1082130432
Вы видите созданную константу .LC0 = 1082130432. Это есть битовое представление 4.0f, в чём легко убедиться: вот такой код
#include
int main()
{
union { int32_t l; float f; };
f = 4;
cout << l;
return 0;
}
выдаёт в точности 1082130432.
2) Ну это же легко проверить, есть гора онлайн-компиляторов. Например: http://ideone.com/GJHdaH выдаёт ответ 1, то есть, умножение имеет более высокий приоритет.
int a = 1;
int b = a >= 0 ? 1 : 2 * 10;
cout << b;
Вы можете подсмотреть приоритеты в стандарте или в документации вашего компилятора, но для обычных целей простого эксперимента достаточно: вряд ли в имплементации компилятора такая дыра!
Важное «но»: если у вас возникли вопросы, такие же вопросы возникнут и у читателей вашего кода. Поэтому не поленитесь расставить скобки, чтобы смысл вашего кода не вызывал вопросов. Не надейтесь, что все остальные держат в голове таблицу приоритетов операций, тем более что в разных языках она разная. Для хорошего, долгоживущего кода очень важна читаемость.
Комментариев нет:
Отправить комментарий