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?
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.
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.