题
根据 海湾合作委员会文档, 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更快。在我的测试,其实,它的的从不的速度更快,甚至进行比较时只有几个字节。
现在在2017年,GCC和锵似乎有尺寸1,2,4,8的缓冲液和其他一些一些优化,例如3,5和多个的8。
不隶属于 StackOverflow