我一直在玩Godbolt,看看编译器如何优化指令,我注意到的是简单C程序的优化似乎在没有实际计算的情况下立即返回。假设我在Godbolt中有一个非常简单的程序(这里(:
int square(int num) {
return num * num;
}
int main(int argc, const char* argv[]){
return square(argc);
}
MIPS 指令输出为:
square:
j $31
mul $2,$4,$4
main:
j $31
mul $2,$4,$4
根据我对MIPS的回忆,这不就是立即跳到$ra
寄存器,实际上什么都不做吗?我认为一旦我们j $31
或跳转到返回地址(而不是执行jal
(,我们实际上就是从该函数返回。那么,如果它在进行乘法之前返回,这是如何工作的呢?
我完全不是一个汇编人,但我不久前确实读过这个。答案是:分支延迟槽。在这里阅读更多: https://devblogs.microsoft.com/oldnewthing/20180411-00/?p=98485
执行分支指令时,即使采用分支,也会执行分支指令之后的指令。分支本身延迟一条指令。