質問
による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、およびいくつかの他のものを持っているようです。