Розглянемо наступний приклад:
struct vector {
int size() const;
bool empty() const;
};
bool vector::empty() const
{
return size() == 0;
}
Створений код складання для vector::empty
(за допомогою кланг, з оптимізаціями):
push rax
call vector::size() const
test eax, eax
sete al
pop rcx
ret
Чому він виділяє стековий простір? Він взагалі не використовується. push
І pop
може бути опущений. Оптимізовані збірки MSVC і gcc також використовують простір стеків для цієї функції (див. На godbolt ), тому повинна бути причина.
@Bob__: Ні. Чому я повинен?
—
Доктор Гут
vector::size()
не визначено в прикладі для імітації того, що він не накреслений.
Отже, як компілятор може оптимізувати те, чого не знає?
—
Боб__
@Bob__: Я думаю, що знання реалізації
—
Доктор Гут
vector::size()
не має значення для виділення або не виділення кадру стека для vector::empty()
. У empty()
ньому просто називається, що б воно не було.
Ну, ви викликаєте функцію, яка щось повертає , вам потрібен простір для цього (якщо ви нічого краще не знаєте).
—
Боб__
this
параметр?