来自 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.
我一直在研究 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.