Рассмотрим следующий пример:
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 ), поэтому должна быть причина.
@Bob__: Нет. Почему я должен?
—
Доктор Гут
vector::size()
не определен в примере, чтобы имитировать, что он не встроен.
Итак, как компилятор может оптимизировать то, чего не знает?
—
Bob__
@Bob__: Я думаю, что знание реализации
—
Доктор Гут
vector::size()
не имеет отношения к выделению или не выделению стекового фрейма vector::empty()
. В empty()
нем просто называется, что бы это ни было.
Ну, вы вызываете функцию, которая возвращает что-то, вам нужно место для этого (если вы не знаете ничего лучше).
—
Bob__
this
параметр?