문제
에 따르면 GCC 문서, MEMCMP는 GCC의 본질적인 기능이 아닙니다. GCC에서 GLIBC의 MEMCMP 속도를 높이려면 문서에 정의 된 하위 레벨 내입을 사용해야합니다. 그러나 인터넷을 검색 할 때 많은 사람들이 MEMCMP가 내장 기능이라는 인상을받는 것 같습니다. 일부 컴파일러가 아닌 다른 컴파일이 아닌가?
해결책
귀하의 링크는 이것 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보다 빠르지 않을 수 있습니다. 내 테스트에서는 사실입니다 절대 몇 바이트 만 비교할 때에도 더 빠릅니다.
2017 년에 GCC와 Clang은 크기 1, 2, 4, 8의 버퍼에 대한 최적화 (예 : 3, 5 및 배수)에 대한 최적화가있는 것으로 보입니다.
제휴하지 않습니다 StackOverflow