来自 C 的优化 MIPS 指令立即返回?

Optimized MIPS instructions from C returning immediately?

我一直在研究 Godbolt 以了解编译器如何优化指令,我注意到的是简单 C 程序的优化似乎 return 立即 return 而无需实际进行计算.假设我在 Godbolt (here) 中有一个非常简单的程序:

int square(int num) {
    return num * num;
}

int main(int argc, const char* argv[]){
    return square(argc);
}

MIPS指令输出为:

square:
        j       
        mul     ,,

main:
        j       
        mul     ,,

根据我对 MIPS 的记忆,这不就是立即跳转到 $ra 寄存器,实际上什么都不做吗?我认为,一旦我们 j 或跳转到 return 地址(而不是执行 jal),那时候我们实际上是从函数中 returning 了。那么,如果它在进行乘法之前 return 是如何工作的呢?

我完全不是一个汇编人员,但我不久前确实读到过这个。答案:分支延迟槽。在这里阅读更多:https://devblogs.microsoft.com/oldnewthing/20180411-00/?p=98485

When you perform a branch instruction, the instruction after the branch instruction is executed, even if the branch is taken. The branch itself is delayed by one instruction.