Вопрос

Согласно документы 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.В моих тестах, на самом деле, это никогда быстрее, даже при сравнении всего нескольких байтов.

Видишь http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052

Теперь, в 2017 году, GCC и Clang, похоже, имеют некоторые оптимизации для буферов размеров 1, 2, 4, 8 и некоторых других, например 3, 5 и кратных 8.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top