37

为什么memcmp(a, b, size)比:

for(i = 0; i < nelements; i++) {
    if a[i] != b[i] return 0;
}
return 1;

memcmp 是 CPU 指令还是什么?它一定很深,因为我使用memcmp循环获得了巨大的加速。

4

3 回答 3

48

memcmp通常在汇编中实现以利用许多特定于体系结构的功能,这可以使其比 C 中的简单循环快得多

作为“内置”

GCC 支持memcmp(以及大量其他功能)作为builtins。在 GCC 的某些版本/配置中,对 的调用memcmp将被识别为__builtin_memcmp. callGCC 不会向库函数发出 a ,而是memcmp发出一些指令来充当函数的优化内联版本。

在 x86 上,这利用了cmpsb指令的使用,该指令将一个内存位置的一串字节与另一个内存位置进行比较。这与repe前缀相结合,因此将比较字符串,直到它们不再相等,或者计数耗尽。(究竟是什么memcmp)。

给定以下代码:

int test(const void* s1, const void* s2, int count)
{
    return memcmp(s1, s2, count) == 0;
}

gcc version 3.4.4在 Cygwin 上生成以下程序集:

; (prologue)
mov     esi, [ebp+arg_0]    ; Move first pointer to esi
mov     edi, [ebp+arg_4]    ; Move second pointer to edi
mov     ecx, [ebp+arg_8]    ; Move length to ecx

cld                         ; Clear DF, the direction flag, so comparisons happen
                            ; at increasing addresses
cmp     ecx, ecx            ; Special case: If length parameter to memcmp is
                            ; zero, don't compare any bytes.
repe cmpsb                  ; Compare bytes at DS:ESI and ES:EDI, setting flags
                            ; Repeat this while equal ZF is set
setz    al                  ; Set al (return value) to 1 if ZF is still set
                            ; (all bytes were equal).
; (epilogue) 

参考:

作为库函数

memcmp许多 C 标准库中存在高度优化的版本。这些通常会利用特定于架构的指令来并行处理大量数据。

在 Glibc 中,有一些memcmp 用于 x86_64的版本可以利用以下指令集扩展:

最酷的部分是 glibc 将检测(在运行时)您的 CPU 拥有的最新指令集,并执行为其优化的版本。请参阅以下片段sysdeps/x86_64/multiarch/memcmp.S

ENTRY(memcmp)
    .type   memcmp, @gnu_indirect_function
    LOAD_RTLD_GLOBAL_RO_RDX
    HAS_CPU_FEATURE (SSSE3)
    jnz 2f
    leaq    __memcmp_sse2(%rip), %rax
    ret 

2:  HAS_CPU_FEATURE (SSE4_1)
    jz  3f  
    leaq    __memcmp_sse4_1(%rip), %rax
    ret 

3:  leaq    __memcmp_ssse3(%rip), %rax
    ret 

END(memcmp)

在 Linux 内核中

Linux 似乎没有memcmp针对 x86_64 的优化版本,但针对memcpy, in arch/x86/lib/memcpy_64.S. 请注意,它使用替代基础架构 ( arch/x86/kernel/alternative.c) 不仅在运行时决定使用哪个版本,而且实际上修补自身以仅在启动时做出此决定。

于 2014-01-14T05:43:45.763 回答
0

memcmp 是 CPU 指令还是什么?

它至少是一个高度优化的编译器提供的内在函数。可能是一个或两个机器指令,具体取决于您未指定的平台。

于 2014-01-14T05:44:24.780 回答
0

它通常是一个编译器内在函数,它被翻译成带有用于比较内存块的专门指令的快速汇编。

内在 memcmp

于 2014-01-14T05:45:49.283 回答