Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238

Как работает стек для функций и методов?

01.10.2019, 10:38. Показов 1519. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот к примеру есть такая функция
C++
1
int sumof(int n1, int n2) {return n1+n2;}
Что будет происходить в стеке в памяти потока когда исполнение дойдёт до этой функции?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.10.2019, 10:38
Ответы с готовыми решениями:

MacBook: Горячие клавиши для выпада списка доступных методов и функций
Добрый день! Подскажите комбинацию клавиш на маковской клаве, с помощью которой выпадает в редакторе список доступных методов и функций? ...

Упрощенный синтаксический анализатор(для проверки методов/функций) используя регулярные выражения
Нужно написать метод, регулярное выражение, на С#, который будет проверять правильность ввода процедуры(Pascal). Буду очень благодарен...

Составить программу для решения задачи своего варианта с использованием методов-процедур и функций
Составить программу для решения задачи своего варианта с использованием методов-процедур и функций (самостоятельно продумать, какие...

13
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.10.2019, 11:51
Честно говоря, это скучный вопрос, потому что информации на эту тему в интенете полно. Гуглится по
x86 function frame
x64 function frame
В зависимости от архитектуры. Ну, или в любой книжке по ассемблеру-дизассемблеру.
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
01.10.2019, 12:27  [ТС]
Vourhey, а можно более-менее своими словами? К примеру что случается с переменными int n1, n2? Память под них уже заранее выделена или выделяется только при вызове этой функции?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
01.10.2019, 12:33
Цитата Сообщение от Vanconts Посмотреть сообщение
а можно более-менее своими словами?
Можно, конечно. Только если буду убежден, что ты сам прочитал что-то на эту тему и попытался разобраться в вопросе, но у тебя возникла с чем-то конкретным проблема. По твоему вопросу информация реально есть, найти ее легко. Ну, или жди добрых и понимающих людей.

Добавлено через 3 минуты
Vanconts, есть еще такая прекрасная штука как godbolt.org. Пишешь код и видишь ассемблер. Помогает.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
01.10.2019, 12:36
Цитата Сообщение от Vanconts Посмотреть сообщение
Память под них уже заранее выделена или выделяется только при вызове этой функции?
при старте программы уже известен размер стека, то есть память уже под него выделена, при старте функций просто читают и пишут в эту память используя указатели, то есть происходят только манипуляции с регистром SP.
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.10.2019, 12:39
Цитата Сообщение от Vanconts Посмотреть сообщение
Что будет происходить в стеке в памяти потока когда исполнение дойдёт до этой функции?
Если речь о х86, то все обычно, во время вызова функции будет создан новый stack-frame куда будут помещены параметры функции, ее локальные переменные, а также function return adress. А, ну и регистры перед вызовом должны быть очищены или сохранены. После завершения stack-frame будет уничтожен.
Если смотреть более подробно будет что-то наподобие этого:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; x86
int main() {
; ...
; --------------- sumof call ---------------
; порядок в котором аргументы функции
; будут пушнуты зависит от calling convenion
; обычно это cdecl
0x78    push     3 ; n2 arg
0x7A    push     2 ; n1 arg
0x7C    call     @ILT+123(sumof) (0x0a) ; demangle я упускаю для упрощения
; -------------------------------------------
@ILT+123(sumof):
0x0a    jmp      sumof (0x20)
; -------------------------------------------
int sumof(int,int) {
0x20    push     ebp
; ...
}
1
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
01.10.2019, 12:59  [ТС]
_stanislav, вот что меня интересовало, я где-то видел пример с main и там было сказано что память под переменные созданные в main выделяется сразу, но в то же время я где-то читал что память стека известна уже вроде как на этапе компиляции и две эти ситуации не укладывались в голове

Добавлено через 3 минуты
Azazel-San, можно подробнее описать что происходит в том коде? С ассемблером знаком очень поверхностно и с того кода понимаю только что делают push'ы.
И что значит @ILT?
0
 Аватар для ibse
136 / 76 / 60
Регистрация: 14.09.2019
Сообщений: 218
01.10.2019, 13:12
Vanconts, глянь здесь http://ermak.cs.nstu.ru/cprog/html/016.htm
1
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.10.2019, 13:39
Цитата Сообщение от Vanconts Посмотреть сообщение
Azazel-San, можно подробнее описать что происходит в том коде? С ассемблером знаком очень поверхностно и с того кода понимаю только что делают push'ы.
И что значит @ILT?
Давай попробуем.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
; x86
int main() {
; ... <- здесь идут какие-то инструкции который предшествуют вызову sumof
; --------------- sumof call ---------------
; фактическое начало вызова функциии, создаем stack frame,
; пушим аргументы функции, порядок в котором они
; будут пушнуты зависит от calling convenion обычно это cdecl
0x78    push     3 ; n2 arg был запушен на стек
0x7A    push     2 ; n1 arg был запушен на стек
0x7C    call     @ILT+123(sumof) (0x0a) ; фактический вызов функции
                                        ; также адрес возврата функции был пушнут
                                        ; что-то типа такого адреса 0x81 (условно)
                                        ; demangle я упускаю для упрощения
; -------------------------------------------
; ILT это таблица (массив) дополнительных ссылок
; При линковке компоновщик создает массив ячеек с адресами функций. 
; Вызовы функций перенаправляются через этот массив. 
; Если вы измените адрес функции, вам потребуется обновить адрес только в этом массиве.
@ILT+123(sumof): ; +123 условное смещение, относительно начала ILT
0x0a    jmp      sumof (0x20) ; начало выполнения функции
; -------------------------------------------
int sumof(int,int) {
0x20    push     ebp ; попадаем сюда, это уже кишки ф-и sumof
; обрати внимание на адрес 0x20 он совпадает с тем что был вызван при jmp'е
; ... <- здесь идут остальные инструкции
0x81    add      esp, 8 ; 0x81 адрес возврата функции, он был пушнут еще при вызове call
0x82    ret      0      ; все инструкции дальше занимаются чисткой и разборкой стека/регистров
}
Опять таки это все условно, если собрать для х64 уже все будет иначе.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
01.10.2019, 13:59  [ТС]
Azazel-San, а память уже заранее выделена под все переменные? Ещё до вызова фугкции

Добавлено через 9 минут
Конечно если они не динамические
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.10.2019, 14:00
Цитата Сообщение от Vanconts Посмотреть сообщение
а память уже заранее выделена под все переменные?
Каких именно?
0
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,120
01.10.2019, 14:33
Цитата Сообщение от Vanconts Посмотреть сообщение
а память уже заранее выделена под все переменные? Ещё до вызова фугкции
Нет, память под локальные переменные и аргументы выделяется в момент вызова.
Адреса локальных переменных и аргументов относительны.
При компиляции определяются смещения адресов, а точка отсчёта определяется в момент вызова.
В этом плане функцию можно сравнить с классом.
Функция - это прототип, как и класс.
Вызов функции - это аналог экземпляра класса.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
01.10.2019, 19:48  [ТС]
Ygg, а в случае если эта функция (sumof) не будет вызвана, будет що компилятор как-то на неё обращать внимание?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
01.10.2019, 20:25
Vanconts, она просто будет сгенерирована.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.10.2019, 20:25
Помогаю со студенческими работами здесь

Как работает стек?
Установил стек но не очень понимаю как с ним работать. подскажите или дайте ссылку на какой нибудь материал.

Стек - реализация с помошью односвязного списка методов добавления и удаления элементов
Стек - реализация с помощью односвязного списка методов добавления и удаления элементов .

Сериализация и десериализация в одном из методов не работает как положено
в двух классах есть методы сериализации и десериализации, в одном все работает нормально, во втором нет, подскажите в чем проблема public...

Как работает изнутри запуск нескольких методов одновременно?
Как работает изнутри запуск нескольких методов одновременно? Точнее, что происходит со стеком? Как ему понятно какие параметры и к чему...

Как работает адрес динамической структуры СТЕК?
У нас имеется динамическая структура - СТЕК. Не могу разобраться как работает объявленный указатель в структуре(Stack* next).Если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru