1. if (a>=1)
2. if (a>0)
3. if (a>1 || a==1)
4. if (a==1 || a>1)
На x86, варианты 1 и 2 производят cmp
инструкцию. Это создаст различные регистры. Затем за cmp
следует разветвление/скачок состояния на основе регистров. Для первого он испускает bge
, для второго он испускает bgt
.
Вариант 3 и 4 - в теории - требуют двух cmp
s- и две ветви, но скорее всего, компилятор просто оптимизировать их быть такими же, как 1.
Вы должны вообще выбрать любой (а) следует за соглашения в коде, над которым вы работаете (b) использовать то, что наиболее четко выражает алгоритм, который вы выполняете.
Бывают случаи, когда явно указывается «если a равно одному или имеет значение больше 1», и в те периоды времени вы должны написать if (a == 1 || a > 1)
. Но если вы просто проверяете, что a имеет положительное, ненулевое целочисленное значение, вы должны написать if (a > 0)
, так как это то, что сказано.
Если вы обнаружите, что такой случай является частью узкого места производительности, вы должны проверить инструкции по сборке и соответствующим образом отрегулировать - например, если вы обнаружите, что у вас есть два cmp
s и ветви, тогда напишите код, чтобы использовать один сравнительный и один ответ.
для * int *, единственные разные - 3 и 4, потому что в 3, например, 1 == будет проверяться только если a> 1 было ложным, а для 4 – user3125280
оптимизация идет, первые два почти наверняка будут генерировать идентичные инструкции. Однако я не уверен в последних двух.Поскольку логический ИЛИ необходим для оценки коротких замыканий своих операндов, компилятору может потребоваться генерировать отдельные инструкции для двух тестов. Во всяком случае, это микро-оптимизация; и не делают 3 и 4, с стилистической точки зрения они выглядят странно. – Praetorian