(使用Apple LLVM version 8.1.0 (clang-802.0.42) Target: x86_64-apple-darwin16.6.0
)
当反汇编用-O2
编译的一些代码时,我注意到很多代码看起来似乎没有必要保存和恢复基本指针rbp
,通常看起来像下面的
pushq %rbp
movq %rsp, %rbp
...
popq %rbp
我知道这会是什么,但它似乎甚至在看似完全没必要的情况下使用,例如在objdump
__Z8identityI5arrayIiLm2EEET_S2_:
60: 55 pushq %rbp
61: 48 89 e5 movq %rsp, %rbp
64: 48 89 f8 movq %rdi, %rax
67: 5d popq %rbp
68: c3 retq
69: 0f 1f 80 00 00 00 00 nopl (%rax)
其中只有两个有意义的指令是从rdi
移动到rax
(第一个参数到返回寄存器)和明显必要的retq
(我假设nopl
是用于填充或对齐以后的任何内容。)
这个看似不必要的上下文保存是否有原因?