根据 海湾合作委员会文档, memcmp 不是 GCC 的固有函数。如果您想在 gcc 下加速 glibc 的 memcmp,则需要使用文档中定义的较低级别的内在函数。然而,在网上搜索时,似乎很多人的印象是memcmp是一个内置函数。它适用于某些编译器而不适用于其他编译器吗?

有帮助吗?

解决方案

根据,您的链接似乎是针对 x86 架构特定的内置函数 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和锵似乎有尺寸1,2,4,8的缓冲液和其他一些一些优化,例如3,5和多个的8。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top