在反汇编中保存不必要的堆栈上下文?

Mon*_*nad 5 macos x86 assembly x86-64 clang

(使用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
Run Code Online (Sandbox Code Playgroud)

我知道这将是什么,但它似乎甚至在似乎完全没有必要的情况下使用,例如在下面的反汇编的复杂身份函数中由 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)
Run Code Online (Sandbox Code Playgroud)

其中只有两个有意义的指令来自移动rdirax(第一自变量返回寄存器)和明显必要retq(I假设nopl为填充或对准用于任何如下).

这种看似不必要的背景保存是否有原因?