gpt4 book ai didi

algorithm - 这个循环优化叫什么,它是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:38:11 25 4
gpt4 key购买 nike

我正在编译以下代码:

#include <stdio.h>
#include <string.h>

int main()
{
char data[1024];
scanf("%s", data);

for (int i = 0; i < strlen(data); i++)
{
if (data[i] == 'a')
{
printf("%d.\n", i);
}
}
}

我正在对 GCC 使用 -O2 优化级别。当检查 gdb 如何在汇编级别完成内部循环时,我在 scanf 之后得到以下指令:

0x40055c:   48 89 e0    mov    %rsp,%rax

然后是迭代的代码:

0x40055f <main+47>      mov    (%rax),%ecx 
0x400561 <main+49> add $0x4,%rax
0x400565 <main+53> lea -0x1010101(%rcx),%edx
0x40056b <main+59> not %ecx
0x40056d <main+61> and %ecx,%edx
0x40056f <main+63> and $0x80808080,%edx
0x400575 <main+69> je 0x40055f <main+47>

我就想问一下,这个优化怎么调用?所以我可以阅读它而不是尝试对汇编代码的工作方式进行逆向工程。

附言我理解这个想法是一次移动 4 个字节而不是一个字节,因此它必须进行更少的迭代,但它是如何调用的以及它是如何工作的?

最佳答案

需要说明的是,那是 strlen,而不是您的循环。

这是基于这个 SWAR 的优化字包含零字节技巧,发现here在其他地方:

#define haszero(v) (((v) - 0x01010101UL) & ~(v) & 0x80808080UL)

由于 strlen 是一个内在函数,这可能不是由任何著名的“命名优化”引起的,它是针对特定函数的特定技巧。

关于algorithm - 这个循环优化叫什么,它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51722793/

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