Функция compare
— это функция, которая принимает два аргумента a
и b
и возвращает целое число, описывающее их значения. заказ. Если a
меньше, чем b
, результатом будет некоторое отрицательное целое число. Если a
больше, чем b
, результатом будет некоторое положительное целое число. В противном случае a
и b
равны, и результат равен нулю.
Эта функция часто используется для параметризации алгоритмов сортировки и поиска из стандартных библиотек.
Реализовать функцию compare
для символов довольно просто; вы просто вычитаете аргументы:
int compare_char(char a, char b)
{
return a - b;
}
Это работает, потому что обычно считается, что разница между двумя символами соответствует целому числу. (Обратите внимание, что это предположение не выполняется для систем, где sizeof(char) == sizeof(int)
.)
Этот трюк не работает для сравнения целых чисел, потому что разница между двумя целыми числами обычно не соответствует в целое число. Например, INT_MAX - (-1) = INT_MIN
предполагает, что INT_MAX
меньше, чем -1
(технически переполнение приводит к неопределенному поведению, но предположим, по модулю арифметики).
Итак, как мы можем эффективно реализовать функцию сравнения для целых чисел? Вот моя первая попытка:
int compare_int(int a, int b)
{
int temp;
int result;
__asm__ __volatile__ (
"cmp %3, %2 \n\t"
"mov $0, %1 \n\t"
"mov $1, %0 \n\t"
"cmovg %0, %1 \n\t"
"mov $-1, %0 \n\t"
"cmovl %0, %1 \n\t"
: "=r"(temp), "=r"(result)
: "r"(a), "r"(b)
: "cc");
return result;
}
Можно ли это сделать менее чем за 6 инструкций? Есть ли менее простой и более эффективный способ?