Различные способы условной проверки

Чтобы проверить int пределах диапазона [1, ∞) или нет, я могу использовать следующие способы (используйте # 1, # 2 много):

  1. if (a>=1)
  2. if (a>0)
  3. if (a>1 || a==1)
  4. if (a==1 || a>1)

Есть ли разница в том, что я должен обратить внимание на четыре версии?

4 ответа

Функционально нет разницы между четырьмя способами, которые вы указали. Это в основном проблема стиля. Я бы рискнул, что №1 и №2 являются наиболее распространенными формами, хотя, если бы я видел № 3 или № 4 в обзоре кода, я бы предложил изменение.

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


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 и двух ветвей, но, скорее всего, компилятор просто оптимизирует их так же, как 1.

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

Бывают случаи, когда явная запись "если a равна единице или имеет значение больше 1", и в те моменты вы должны писать if (a == 1 || a > 1). Но если вы просто проверяете, что a имеет положительное, ненулевое целое значение, вы должны написать if (a > 0), так как это то, что говорится.

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


Я действительно не понимаю, почему вы будете использовать 3 или 4. Помимо того, что они будут длиннее, они будут генерировать больше кода. Поскольку в or условии вторая проверка пропускается, если первая истинна, не должно быть производительности, за исключением версии 4, если значение не часто 1 (конечно, аппаратное обеспечение с предсказанием ветвления в основном отрицает это).


Неа! Все они одинаковы для int. Однако я бы предпочел использовать if (a>0).

licensed under cc by-sa 3.0 with attribution.