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?

War es hilfreich?

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.

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

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top