문제

에 따르면 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보다 빠르지 않을 수 있습니다. 내 테스트에서는 사실입니다 절대 몇 바이트 만 비교할 때에도 더 빠릅니다.

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

2017 년에 GCC와 Clang은 크기 1, 2, 4, 8의 버퍼에 대한 최적화 (예 : 3, 5 및 배수)에 대한 최적화가있는 것으로 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top