Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Познающая
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 25
#1

Извлечение данных из стека - C++

07.02.2013, 23:02. Просмотров 1042. Ответов 5
Метки нет (Все метки)

Доброго времени суток!
Помогите разобраться.
Изучаю функции и мне не понятно, как извлекаются значения локальных переменных из стека. В стек закладываются локальные переменные по мере их определения. Допустим вначале мы внутри функции объявляем переменную а, потом b. Данные из стека берутся по принципу "последним пришел-первым вышел". А что, если нам вначале нужно использовать переменную a, а только потом переменную b?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2013, 23:02     Извлечение данных из стека
Посмотрите здесь:

Извлечение данных из программы - C++
в игре Counter Strike 1.6 на deathrun сервере в чате бывают задания где надо произвести арифметические операции с 5 числами и в том же...

Извлечение данных из введенной пользователем строки - C++
Подскажите как написать или что нужно исправить в том что я написал чтобы пользователь вводил данные в этом формате, сохранить значение в...

Работа с звуковыми файлами (извлечение и сохранение данных) - C++
Всем здравствуйте. Со звуком раньше не работал. Суть задания: считать данные из звукового файла в массив целых чисел, провести оконную...

Запись и извлечение данных в несколько запусков программы - C++
Всем добрый вечер! Предоставляю исходник программы EMPL_IO стр.574 с книги Лаффорте ООП в С++. Пытаясь улучшить программу наткнулся на...

Неправильный вывод данных из стека С++ - C++
Я только-только начал учить С++. Пишу под ДОСом. И у меня вот баг вылез: Я хочу поместить цифры в стек и потом их просто вывести от...

Как создать программу, которая бы обеспечивала создание, просмотр, дополнения и извлечение данных из файла - C++
создать программу, которая бы обеспечивала создание, просмотр, дополнения и извлечение данных из файла, содержащего информацию об итогах...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
261 / 260 / 33
Регистрация: 03.02.2013
Сообщений: 714
07.02.2013, 23:58     Извлечение данных из стека #2
Цитата Сообщение от Познающая Посмотреть сообщение
Доброго времени суток!
Помогите разобраться.
Изучаю функции и мне не понятно, как извлекаются значения локальных переменных из стека. В стек закладываются локальные переменные по мере их определения. Допустим вначале мы внутри функции объявляем переменную а, потом b. Данные из стека берутся по принципу "последним пришел-первым вышел". А что, если нам вначале нужно использовать переменную a, а только потом переменную b?
тогда используйте очередь, она именно для этого
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
08.02.2013, 01:01     Извлечение данных из стека #3
Познающая, когда мы ее используем, мы не удаляем ее из стека. Она продолжает там храниться
Принцип "последним пришел-первым вышел" говорит о порядке создания/удаления переменных в стеке
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
08.02.2013, 01:19     Извлечение данных из стека #4
Цитата Сообщение от Познающая Посмотреть сообщение
Доброго времени суток!
Помогите разобраться.
Изучаю функции и мне не понятно, как извлекаются значения локальных переменных из стека. В стек закладываются локальные переменные по мере их определения. Допустим вначале мы внутри функции объявляем переменную а, потом b. Данные из стека берутся по принципу "последним пришел-первым вышел". А что, если нам вначале нужно использовать переменную a, а только потом переменную b?
В стек закладываются не отдельные переменные, а так называемые записи активаций функций, они же фреймы стека (они же стековые кадры и ещё бог весь что). В этих записях сразу выделяется место под адрес возврата, аргументы функции и все её локальные переменные. Аппаратный стек это не абстрактный тип данных, откуда можно доставать элементы только с верхушки. I.M. правильно сказал, что это просто метафора порядка создания удаления этих самых записей активаций. Функции же просто помнят, что локальная переменная с таким-то именем лежит в пяти ячейках от текущей верхушки стека, например.
Познающая
0 / 0 / 0
Регистрация: 22.11.2012
Сообщений: 25
08.02.2013, 16:54  [ТС]     Извлечение данных из стека #5
Так более понятно) Спасибо! Просто смутила общепринятая аналогия, проводимая между стеком и стопкой тарелок, что если ты хочешь достать тарелки снизу, то вначале надо взять верхние.
Можете еще, пожалуйста, какую-нибудь литературу посоветовать, где про организацию памяти доступно написано.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.02.2013, 02:07     Извлечение данных из стека
Еще ссылки по теме:

Создать стек из вещественных чисел; найти максимальный элемент в стеке; организовать просмотр данных стека - C++
Создать стек из вещественных чисел. Определить максимальный элемент в стеке. Организовать просмотр данных стека.

Извлечение DLL - C++
Можете мне объяснить ,как зделать так,штобы после запуска exe'шник извлекал из себя dll?

извлечение флешки - C++
господа,а как можно програмно сделать безопасное извлечение флешки?

Извлечение корня - C++
Не подскажите функцию в С++ для извлечения корня

Извлечение из очереди - C++
Доброго дня. Имеем очередь , извлекаем первый элемент. Собственно вопрос , если мы удалим первый элемент , то как сообщить стоящему...

Извлечение значения и 3-и ключа - C++
Каким образом можно сделать или даже использовать уже готовую структуру данных, с помощью которой в нее можно поместить 4 аргумента или 2....


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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
09.02.2013, 02:07     Извлечение данных из стека #6
типичный код функции с локальными переменными выглядит так.
C++
1
2
3
4
5
6
void func(){
int a;
int b;
a=0;
b=a+1;
}
Я так понял, ты услышал, что локальные переменные пихаются в стек и это тебя смутило.
Т.к. ты решил, что обращаются к ним командами push и pop
Нет, в ассемблере вышеприведённый код возможно будет выглядеть как
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
push ebp;      //сохранить прежнее значение ebp которое было вне функции, 
                    ;//ebp будет сейчас изменён, а до вызова функции в нём могло быть
                   ;// что-то полезное
mov ebp, esp     ;//теперь в ebp хранится вершина стека в момент входа в функцию,
                              ;// т.к. в процессе выполнения стек может расти и esp в  этой роли использовать неудобно: он меняется.
sub esp, 8;     //далее в стек запихивается место под две переменные типа int (8 байт)
                       ; // обрати внимание, что пихать/вынимать из стека можно не только командами push/pop
                       ;    // но и просто "арифметическим" уменьшением/увеличением вершины стека соответственно
mov [ebp+4], 0;   ///обращение к первой переменной
                        ;   // обрати внимание, ты думал, чтобы обратиться к переменной в стеке требуется команда pop 
                         ;// нет, мы специально сохранили в регистре ebp адрес, от которого начинается размещение локальных переменных
mov eax, [ebp+4];
add  eax, 1;
mov [ebp+8], eax;   //вычисления идут и к локальным переменным мы обращаемся, указывая смещение относительно ebp
 
 
add esp, 8;   //перед завершением функции, мы совершаем обратные действия:
                 ;   // назад опускаем вершину стека.
                ;   //( тот же эффект был бы достигнут несколькими командами pop )
pop ebp;   //и восстанавливаем ebp
Компиляторы С++ не обязательно генерируют именно такой код,
Но именно этот код демонстрируют, что имеют в виду, когда говорят "Локальные переменные хранятся в стеке"
Yandex
Объявления
09.02.2013, 02:07     Извлечение данных из стека
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru