Frage
Nach der gcc docs ist memcmp keine intrinsische Funktion von GCC. Wenn Sie memcmp unter gcc beschleunigen Glibc wollten, würden Sie brauchen, um die untere Ebene Spezifika in der Dokumentation definiert verwenden. Wenn jedoch um die Suche im Internet, so scheint es, dass viele Menschen den Eindruck haben, dass memcmp eine eingebaute Funktion ist. Ist es für einige Compiler und nicht für andere?
Lösung
Ihr Link erscheint für die x86-Architektur-spezifische integrierten Funktionen, nach dieser memcmp implementiert als ein architekturunabhängige built-in von gcc.
Edit:
Kompilieren Sie den folgenden Code mit Cygwin gcc Version 3.3.1 für 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));
}
Die Ausgabe (beachten Sie, dass der Aufruf von memcmp () zu einem 8-Byte umgesetzt wird "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
Andere Tipps
Beachten Sie, dass die repz CMPSB Routine nicht schneller sein könnte als Glibc memcmp. In meinen Tests, in der Tat, es ist nie schneller, auch beim Vergleich von nur wenigen Bytes.
Jetzt im Jahr 2017, GCC und Clang scheint 1 einige Optimierungen für Puffer von Größen zu haben, 2, 4, 8 und einige andere, zum Beispiel 3, 5 und Vielfaches von 8.