Удалит ли оптимизирующий компилятор вызовы метода, результат которого будет умножен на ноль?

Предположим, у вас есть вычислительно затратный метод Compute (p) , который возвращает некоторое число с плавающей запятой, и другой метод, Falloff (p) , который возвращает другое число с плавающей запятой от нуля до единицы.

Если вы вычислите Falloff (p) * Compute (p) , Compute (p) по-прежнему будет выполняться, когда ] Falloff (p) возвращает ноль? Или вам нужно написать специальный случай, чтобы предотвратить ненужный запуск Compute (p)?

Теоретически, оптимизирующий компилятор может определить, что пропуск Compute, когда Falloff возвращает ноль, не повлияет на программу. Тем не менее, это довольно сложно проверить, поскольку, если у вас есть выходные данные Compute, чтобы определить, работает ли он, компилятор будет знать, что не пропускать их из-за этой отладочной информации, что приведет к ситуации типа кота Шредингера.

Я знаю, что безопасное решение этой проблемы - просто добавить специальный случай, но мне просто любопытно.

5
задан Tim R. 22 December 2010 в 07:01
поделиться