Легко видеть, что:Оптимизированы логические операции над несколькими модулями?
(i % 3 == 0) && (i % 5 == 0)
Может быть упрощена:
(i % 15 == 0)
Тем не менее, глядя на выходе GCC, кажется, это не сделано даже на высоких уровнях оптимизации.
Выполняют ли какие-либо компиляторы такие виды оптимизации, или есть веская причина, почему эти два теста не являются семантически эквивалентными?
Edit: В ответ на тех, кто говорит, что это бахрома случай, следующий подобный случай:
(i < 3) && (i < 5)
Любое число меньше, чем 3, всегда должно быть меньше 5. Второй тест является излишним.
Я также хотел бы добавить следующее в ответ на ответ, что компилятор не может знать, если окружающая среда влияет ... Посмотрите на этот код:
void foo(void)
{
int i;
for (i = 0; i <= 10; i++)
{
if (i > 20)
{
puts("Hi");
}
}
}
Всего функция сводится к «REPZ отставке "по GCC с -O2
. Это гораздо сложнее, чем все, о чем я говорю.
Мое предположение заключается в том, чтобы гарантировать оценку короткого замыкания ... – Anycorn
Соберите ли компиляторы для нескольких сравнений для одной и той же переменной для оптимизации? Это похоже на бахрому ... – trutheality
@Anycorn, Вы говорите, что оценка 'i' может иметь побочные эффекты, а компилятор не делает это или нет? – ikegami