Що таке call stack

Колись був оператор goto, і програми виглядали так

Щоб при зупинці виконання (на точці зупинки або при викиді виключення) дізнатися, в якій функції (і можливо з номером рядки коду) сталася зупинка, з вкладеністю.


Call stack trace of exception:

Англійська не дуже добре знаю,
Причому тут англійська, треба було просто перевірити це вікно в роботі.

Програміст на «сі з хрестами» і не тільки

Call stack - це стек викликів, апаратна фішка всіх великих процесорів.

Ось ми заходимо в функцію main (). В цей час в пам'яті з'являється змінна z. А потім в foo () - з'являється ще й змінна y. А потім виходимо з foo - y зникає. Що у нас виходить? Або в кінець додаємо одну або кілька локальних змінних, або з того ж кінця видаляємо їх. Яка структура даних підходить для цього? Стек: додавати в кінець, видаляти з кінця. Все це, нагадую, реалізовано в x86 апаратно, одним сегментом, двома регістрами (esp = 32-bit stack pointer і ebp = 32-bit base pointer) і декількома командами (push, pop, call, ret ...).

Локальні змінні, що належать одній функції, називаються стековий фрейм. При цьому фреймів однієї функції може бути кілька, якщо вона викликає сама себе, прямо або опосередковано - як функція bar ().

У найбільш відомої моделі виклику можна, «розмотуючи» стек фрейм за фреймом, подивитися, яка функція яку викликала. Це і виведено в вікні Call Stack. Оскільки оцінний доступ дуже повільний, зазвичай виводиться тільки верхівка стека. Більш того, тицьнувши в будь-якому місці вікна Call Stack, ми можемо побачити локальні змінні того примірника функції.

Оскільки стек апаратний, його не можна розширювати; можна тільки до початку програми / потоку вказати, скільки пам'яті нам вистачить. І тому часта помилка «переповнення стека».

Схожі статті