Рассмотрим следующий пример:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
Сгенерированный ассемблерный код для vector::empty
(по clang, с оптимизациями):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
Почему он выделяет место в стеке? Он вообще не используется. push
и pop
можно не указывать. Оптимизированные сборки MSVC и gcc также используют пространство стека для этой функции (см. godbolt), поэтому должен быть причина.
this
? - person dan04   schedule 08.01.2020this
передается вrcx
регистре в MSVC и вrdi
в clang и gcc. См. Этот пример. Не требует стека. - person Dr. Gut   schedule 08.01.2020vector::size()
функцию? - person Bob__   schedule 08.01.2020vector::size()
не определен в примере, чтобы имитировать, что он не встроен. - person Dr. Gut   schedule 08.01.2020vector::size()
не имеет отношения к выделению или невыделению кадра стека дляvector::empty()
. Вempty()
он просто называется, как бы там ни было. - person Dr. Gut   schedule 08.01.2020eax
. Для этого стек не нужен. - person Fred Larson   schedule 08.01.2020push
иpop
нельзя опускать, потому что они не используют один и тот же регистр. - person Mark Ransom   schedule 08.01.2020rax
, но перемещения его вrcx
. - person Fred Larson   schedule 08.01.2020add rsp
-подобные инструкции. Регистрация здесь не имеет значения. Дляpop
используетсяrcx
, потому что он может быть удален. - person geza   schedule 08.01.2020