跳到主要内容

循环与 switch 的汇编

循环语句怎样翻译成条件分支?​

  • 思路: 把循环统一改写成条件测试加回跳的结构;
// do-while
loop:
body-statement;
t = test-expr;
if (t) goto loop;

// while
t = test-expr;
if (!t) goto done;
loop:
body-statement;
t = test-expr;
if (t) goto loop;
done:

// for
init-expr;
t = test-expr;
if (!t) goto done;
loop:
body-statement;
update-expr;
t = test-expr;
if (t) goto loop;
done:
  • 结论: 三种循环在机器级只是测试位置不同的同一结构;

switch 语句为什么比一串 if 更快?​

  • 跳转表: 由代码段地址构成、用下标直接索引的数组;
  • 翻译: switch 被译成一次边界检查和一条跳转表取址;
  • 收益: 分支数增加时仍只做常数次操作;