Если я скомпилировать пустую функцию CПочему пустая функция не только возврат
void nothing(void)
{
}
с помощью gcc -O2 -S
(и clang
) на MacOS, он генерирует:
_nothing:
pushq %rbp
movq %rsp, %rbp
popq %rbp
ret
Почему gcc
не удалить все, кроме ret
? Кажется, это простая оптимизация, если она действительно не делает что-то (кажется, не для меня). Этот шаблон (push/move в начале, pop в конце) также отображается в других непустых функциях, где rbp
в противном случае не используется.
В Linux с использованием более поздних gcc
(4.4.5) Я вижу только
nothing:
rep
ret
Почему в rep
? rep
отсутствует в непустых функциях.
У меня нет 4.5.5, но я посмотрю на его установку. Но clang дает те же избыточные коды, поэтому я подумал, что может быть причина ... –
_ "Почему' rep'? "_. Причина [поясняется здесь] (http://repzret.org/p/repzret/). – Michael
Что делать, если вы явно указываете '-fomit-frame-pointer' при компиляции на OSX? – Michael