6

根据gcc docs, memcmp 不是 GCC 的内在功能。如果您想在 gcc 下加速 glibc 的 memcmp,则需要使用文档中定义的较低级别的内在函数。但是,在网上搜索时,似乎很多人都认为 memcmp 是一个内置函数。它适用于某些编译器而不适用于其他编译器吗?

4

3 回答 3

9

请注意,repz cmpsb 例程可能不会比 glibc 的 memcmp 快。事实上,在我的测试中,它从来没有更快,即使只比较几个字节。

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

于 2011-06-13T18:15:59.657 回答
5

您的链接似乎是针对特定于 x86 体系结构的内置函数的,根据这个memcmp 是由 gcc 实现为与体系结构无关的内置函数。

编辑:

使用 Cygwin gcc 版本 3.3.1 for 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));
}

产生以下输出(注意对 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    
于 2009-05-13T03:26:27.323 回答
0

现在在 2017 年,GCC 和 Clang 似乎对大小为 1、2、4、8 和其他一些(例如 3、5 和 8 的倍数)的缓冲区进行了一些优化。

于 2017-05-11T20:59:34.613 回答