如果我编译一个空的 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
非空函数中不存在。