Question

Selon les docs gcc , memcmp est une fonction intrinsèque de GCC. Si vous voulez accélérer le memcmp de glibc sous gcc, vous devez utiliser les valeurs intrinsèques de niveau inférieur définis dans la documentation. Cependant, lors de la recherche autour de l'Internet, il semble que beaucoup de gens ont l'impression que memcmp est une fonction intégrée. Est-il pour certains compilateurs et pas pour d'autres?

Était-ce utile?

La solution

Votre lien semble être pour le intégré spécifique à l'architecture x86 fonctions, selon cette memcmp est mis en œuvre une architecture indépendante intégrée par gcc.

Edit:

Compiler le code suivant avec la version gcc 3.3.1 Cygwin pour 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));
}

produit la sortie suivante (à noter que l'appel à memcmp () est converti en un "repz CMPSB" 8 octets):

   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    

Autres conseils

Notez que la routine repz de CMPSB pourrait ne pas être plus rapide que la memcmp de glibc. Dans mes tests, en fait, il est jamais plus rapide, même lorsque l'on compare seulement quelques octets.

Voir http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052

Maintenant, en 2017, CCG et Clang semble avoir des optimisations pour des tampons de taille 1, 2, 4, 8 et d'autres, par exemple 3, 5 et multiple de 8.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top