質問

によるgccのドキュメント、memcmpは、GCCの組み込み関数ではありません。あなたがgccの下のglibcのmemcmpをスピードアップしたい場合は、ドキュメントに定義されている低レベルの組み込み関数を使用する必要があります。インターネットの周りに検索するときしかし、多くの人々がmemcmpは、組み込み関数であるという印象を持っているようです。いくつかのコンパイラのためではなく他人のためにそれはありますか?

役に立ちましたか?

解決

あなたのリンクは<のhref = "http://ftp.sunsite.ualberta.ca/Documentation/Gnu/gcc-3.0.2/html_node/によると、x86アーキテクチャ固有の組み込み関数のためにあるように思われますgcc_113.html」REL = "nofollowをnoreferrer">このするのmemcmpとして実装されるアーキテクチャに依存しない内蔵gccでます。

編集ます:

i686のためのCygwinのgccのバージョン3.3.1、-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ルーチンはglibcののmemcmpよりも高速ではないかもしれないことに注意してください。私のテストでは、実際には、それだけで数バイトを比較した場合でも、より速く、のことはありませんのです。

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43052 <を参照してください。 />

次に2017年に、GCCとクランは、実施例3,5および8の倍数のために、いくつかのサイズ1のバッファの最適化、2、4、8、およびいくつかの他のものを持っているようです。

scroll top