空の C 関数をコンパイルすると
void nothing(void)
{
}
MacOS でgcc -O2 -S(および)を使用すると、以下が生成されます。clang
_nothing:
pushq %rbp
movq %rsp, %rbp
popq %rbp
ret
gcc以外のすべてを削除しないのはなぜretですか? 本当に何かをしない限り、簡単に最適化できるように思えます (私にはそうではないようです)。このパターン (最初にプッシュ/ムーブ、最後にポップ) は、使用されていない他の空でない関数にも見られますrbp。
最近のgcc (4.4.5)を使用しているLinuxでは、
nothing:
rep
ret
なぜrepですか?rep空でない関数には がありません。