gpt4 book ai didi

c - 为什么 memcmp(a, b, 4) 有时只针对 uint32 比较进行优化?

转载 作者:太空狗 更新时间:2023-10-29 16:16:16 25 4
gpt4 key购买 nike

给定这段代码:

#include <string.h>

int equal4(const char* a, const char* b)
{
return memcmp(a, b, 4) == 0;
}

int less4(const char* a, const char* b)
{
return memcmp(a, b, 4) < 0;
}

GCC 7 on x86_64 针对第一种情况引入了优化(Clang 已经做了很长时间):

    mov     eax, DWORD PTR [rsi]
cmp DWORD PTR [rdi], eax
sete al
movzx eax, al

但是第二种情况还是调用了memcmp():

    sub     rsp, 8
mov edx, 4
call memcmp
add rsp, 8
shr eax, 31

是否可以对第二种情况应用类似的优化?什么是最好的程序集,是否有任何明确的理由说明它没有被完成(由 GCC 或 Clang 完成)?

在 Godbolt 的编译器资源管理器上查看它:https://godbolt.org/g/jv8fcf

最佳答案

如果您为小端平台生成代码,针对单个 DWORD 比较的不等式优化四字节 memcmp 是无效的。

memcmp 比较各个字节时,无论平台如何,它都会从低地址字节到高地址字节。

为了使 memcmp 返回零,所有四个字节必须相同。因此,比较的顺序无关紧要。因此,DWORD 优化是有效的,因为您忽略了结果的符号。

但是,当 memcmp 返回正数时,字节顺序很重要。因此,使用 32 位 DWORD 比较实现相同的比较需要特定的字节序:平台必须是 big-endian,否则比较的结果将不正确。

关于c - 为什么 memcmp(a, b, 4) 有时只针对 uint32 比较进行优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45052282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com