【发布时间】:2016-01-17 02:20:02
【问题描述】:
我想知道为什么
if(x == y)在C编程语言中翻译成
'bne' 条件而不是 MIPS 中的 'beq' 条件?
【问题讨论】:
-
bne => ne 对于
not equal。 beq => eq 为equal
我想知道为什么
if(x == y)在C编程语言中翻译成
'bne' 条件而不是 MIPS 中的 'beq' 条件?
【问题讨论】:
not equal。 beq => eq 为equal
暂时忽略条件,考虑这些代码块在汇编语言指令流中可能打印的顺序:
// A
if (x == y) {
// B
}
// C
当x == y 为真时,流程按顺序从 A 到 B 到 C。相等时不需要跳转 (beq),因为所需的流程与指令中打印块的方式相匹配流。
当然,仅将这些作为此特定案例的示例思考过程。
在一般情况下,这些都是实现细节。编译器可以以它认为合适的任何方式打印指令,包括反转条件。 (请记住,由于现代 CPU 流水线的存在,编译器的一个强大的优化目标通常是成功猜测最可能的执行路径并确保它包含尽可能少的跳转。)
【讨论】:
beq 或 bne 或其他任何东西)。
如果条件为假,最好在 if 块上进行分支,而不是在条件为真时执行 if 块。
这些听起来很相似,但比较以下:
if (x == y)
{
A;
}
B;
相当于(伪Cbne变体):
if (x != y)
goto not_equal;
A;
not_equal:
B;
只有x != y才会分支。
如果你使用beq,你会得到这个烂摊子:
if (x == y)
goto equal;
goto not_equal;
equal:
A;
not_equal:
B;
在这两种情况下都会分支。
即使没有指令流水线,有时只进行分支也比总是进行分支更有效。
【讨论】: