Вопрос
Согласно документы gcc, memcmp не является встроенной функцией GCC.Если вы хотите ускорить работу memcmp glibc в gcc, вам нужно было бы использовать встроенные функции более низкого уровня, определенные в документах.Однако при поиске в Интернете у многих людей складывается впечатление, что memcmp - это встроенная функция.Это для одних компиляторов, а не для других?
Решение
Ваша ссылка, по-видимому, предназначена для встроенных функций, специфичных для архитектуры x86, в соответствии с это memcmp реализован как архитектурно-независимый встроенный модуль gcc.
Редактировать:
Компиляция следующего кода с помощью Cygwin gcc версии 3.3.1 для i686, -O2:
#include <stdlib.h>
struct foo {
int a;
int b;
} ;
int func(struct foo *x, struct foo *y)
{
return memcmp(x, y, sizeof (struct foo));
}
Выдает следующий вывод (обратите внимание, что вызов memcmp() преобразуется в 8-байтовый "repz cmpsb"):
0: 55 push %ebp
1: b9 08 00 00 00 mov $0x8,%ecx
6: 89 e5 mov %esp,%ebp
8: fc cld
9: 83 ec 08 sub $0x8,%esp
c: 89 34 24 mov %esi,(%esp)
f: 8b 75 08 mov 0x8(%ebp),%esi
12: 89 7c 24 04 mov %edi,0x4(%esp)
16: 8b 7d 0c mov 0xc(%ebp),%edi
19: f3 a6 repz cmpsb %es:(%edi),%ds:(%esi)
1b: 0f 92 c0 setb %al
1e: 8b 34 24 mov (%esp),%esi
21: 8b 7c 24 04 mov 0x4(%esp),%edi
25: 0f 97 c2 seta %dl
28: 89 ec mov %ebp,%esp
2a: 5d pop %ebp
2b: 28 c2 sub %al,%dl
2d: 0f be c2 movsbl %dl,%eax
30: c3 ret
31: 90 nop
Другие советы
Обратите внимание, что процедура repz cmpsb может быть не быстрее, чем memcmp glibc.В моих тестах, на самом деле, это никогда быстрее, даже при сравнении всего нескольких байтов.
Теперь, в 2017 году, GCC и Clang, похоже, имеют некоторые оптимизации для буферов размеров 1, 2, 4, 8 и некоторых других, например 3, 5 и кратных 8.