Рассмотрим следующий пример:
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параметр?