Подтвердить что ты не робот

Меньше, чем против. Равный для эффективности C/С++

Когда я использовал более старые API-интерфейсы, например, API-интерфейсы C в Unix, я всегда замечаю, что люди предпочитают меньше (<) по сравнению с (==) при сравнении их плохих возвращаемых значений.

int result = send(...);
if (result < 0) { perror("..."); }

В случаях, о которых я говорю, код возврата всегда положителен, 0 или -1errno установлено правильное значение). Так почему бы просто не проверить ошибку, используя (result == -1) вместо (result < 0)?

Я спрашиваю, потому что мне было интересно, если это по привычке или если более эффективно использовать меньше, чем? Я думал о том, что если бы вы сравнивали два uint64_t, и вы обнаружили разницу в MSB, вам не пришлось бы проверять остальные 7 байтов и т.д. Я мог бы достичь этой логики, хотя!

4b9b3361

Ответ 1

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

Ответ 2

Хорошо, давайте узнаем. Это GCC 4.6.1 на x86 с -O3, а a имеет тип int:

if (a < 0):

 movl    4(%esp), %eax
 testl   %eax, %eax
 js      .L4

if (a == -1):

cmpl    $-1, 4(%esp)
je      .L4

Здесь 4(%esp) - это переменная a, а .L4 обозначает назначение перехода для условного выражения.


Обновление: как предлагает @yi_H, теперь сравните if (h() < 0) и if (h() == -1), где int h(); - некоторая функция. Мы имеем:

<       testl   %eax, %eax
<       js      .L4
---
>       cmpl    $-1, %eax
>       je      .L4

Ответ 3

Это делается для надежности, а не эффективности. Если вы проверяете только определенные значения возвращаемого значения, например -1, а позже API модифицируется, чтобы возвращать -1 для одного типа ошибок и -2 для другого типа ошибки, код больше не будет корректно вести себя. В большинстве API-интерфейсов отрицательное возвращаемое значение указывает на ошибку, поэтому проверяя, что возвращаемое значение является отрицательным, чтобы определить, произошла ли ошибка, это надежное решение.

Ответ 4

Для меня единственное различие в вашем вопросе касается специфики.

проверка < 0 - очень общий тест, который позволяет какое-то "будущее расширение".

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

Ответ 5

Это не вопрос меньше, чем против равных. Это вопрос нуля по сравнению с любым другим числом. Сравнение с нулем (любое сравнение - равенство, большее/равное и т.д.) Обычно дешевле, чем сравнение с конкретным ненулевым значением.

Ответ 6

В некоторых архитектурах сравнение с нулем имеет более короткую и, следовательно, немного более быструю реализацию.

Ответ 7

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