如果我编译一个空的 C 函数
void nothing(void)
{
}
在 MacOS 上使用gcc -O2 -S(and ),它会生成:clang
_nothing:
pushq %rbp
movq %rsp, %rbp
popq %rbp
ret
为什么不gcc删除除ret? 除非它真的做某事(对我来说似乎不是),否则这似乎是一个容易进行的优化。这种模式(开始时推/移动,结束时弹出)在其他未使用的非空函数中也可见rbp。
在 Linux 上使用更新的gcc (4.4.5)我只看到
nothing:
rep
ret
为什么rep?rep非空函数中不存在。