空の 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
空でない関数には がありません。