为什么循环总是被编译成“do ... while”样式(尾部跳转)?

时间:2017-12-13 00:51:51

标签: performance loops assembly optimization micro-optimization

当试图理解汇编(启用编译器优化)时,我看到了这种行为:

像这样的非常基本的循环

outside_loop;
while (condition) {
     statements;
}

经常被编译成(伪代码)

    ; outside_loop
    jmp loop_condition    ; unconditional
loop_start:
    loop_statements
loop_condition:
    condition_check
    jmp_if_true loop_start
    ; outside_loop

但是,如果未启用优化,则会编译为通常可理解的代码:

loop_condition:
    condition_check
    jmp_if_false loop_end
    loop_statements
    jmp loop_condition  ; unconditional
loop_end:

根据我的理解,编译后的代码更像是这样的:

goto condition;
do {
    statements;
    condition:
}
while (condition_check);

我看不到巨大的性能提升或代码可读性提升,为什么经常出现这种情况?是否有此循环样式的名称,例如“尾随条件检查”?

0 个答案:

没有答案