Виртуальная машина Java пропускает умножение на ноль? - PullRequest
0 голосов
/ 17 февраля 2012

Я хотел бы знать, избегает ли умножение на ноль виртуальной машины Java. Спасибо

Ответы [ 3 ]

2 голосов
/ 17 февраля 2012

Согласно Спецификации языка Java , «каждый операнд оператора (кроме условных операторов &&, || и? :), по-видимому, полностью вычисляется до выполнения какой-либо части самой операции». . "

Следовательно, даже если компилятор или среда выполнения могут обнаружить, что один фактор равен нулю, он все равно должен оценить другой фактор, если другой может иметь побочные эффекты.

1 голос
/ 17 февраля 2012

Стоит отметить, что умножение на 0 не всегда равно 0. Например, для бесконечности и NaN, умножение на 0 дает NaN.

Компилятор javac оптимизирует константные выражения.Если компилятор может определить, что результат всегда является фиксированным значением, он выполняет вычисления во время компиляции.

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

1 голос
/ 17 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...