gpt4 book ai didi

c - 为什么 "guarded do"在 asm 中比 "jump to middle"好

转载 作者:行者123 更新时间:2023-12-04 04:02:27 25 4
gpt4 key购买 nike

我正在阅读一本教科书,它描述了将 while 循环转换为机器代码的两种方法:

//jump to middle
goto test;
loop:
body-statement
test:
t = test-expr;
if (t)
goto loop;
//guarded do

t = test-expr;
if (!t)
goto done;
loop:
body-statement
t = test-expr;
if (t)
goto loop;
done:
不知道为什么用第二种方法,编译器可以优化初始测试?

最佳答案

I don't know why using the secoond aproach, the compiler can optimize the initial test?


这是编译完成后 asm/机器码的样子,使用 C 作为 asm 的伪代码 . (像这样编写 C 是没有用的。)在我们到达这一步之后,没有进一步的优化/编译发生。
在实际的 C 中,你只需写 while(t)for(int i=0 ; i<n ; i++)像普通人一样(惯用的 C 循环),让编译器创建惯用的 asm 循环(底部的条件分支)。这就是编译器的用途。
相关: Why are loops always compiled into "do...while" style (tail jump)?
跳转到中间的主要缺点是它在通过函数的所有路径上放置了一个额外的无条件跳转。 (循环是否运行零次迭代)。
剥离第一次迭代前的测试以制作 if(run_at_all) do_loop通过复制测试代码来避免这种跳转,而不是跳转到它的单个副本。
有时它可以被优化掉:许多循环都有一个已知的行程计数,或者如果编译器可以证明关于 t 的任何信息,或者至少是已知的非零值。对于第一次迭代。

关于c - 为什么 "guarded do"在 asm 中比 "jump to middle"好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62869453/

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