Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.94
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
#1

Стек и куча: как все это работает? - C++

21.02.2013, 23:13. Просмотров 7377. Ответов 58
Метки нет (Все метки)

Добрый вечер, подскажите пожалуйста хорошую литературу (сайты) по куче и стеку. Как оно все работает?
Насколько я понял все статические переменные лежат в стеке. К примеру в программе есть несколько переменных: а, б и с. Значит где-то должен хранится адрес каждой из них? Как осуществляется доступ к переменным?
Указатели (переменные) к примеру хранятся в стеке?
Вообщем вопрос один где про это все толково написано?
Спасибо за все хорошие источники...
2
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2013, 23:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Стек и куча: как все это работает? (C++):

как все это в подробностях работает? - C++
#include <iostream> #include<cstdlib> using namespace std; int main() { setlocale(LC_ALL, "Russian"); int i; int r; ...

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

Стек и куча - C++
Вроде разобрался с этими зверями, хочется уточнить некоторые моменты на понимание: физически они в ОЗУ, сначала сегмент кода программы,...

Стек или куча: как "правильно" создавать объекты классов? - C++
У меня несколько странновато-ламерский вопрос, но ведь в том и смысл: чтобы таких вопросов не осталось, на них один фиг сначала нужно...

Что такое куча,стек,очередь? - C++
Доброго Вам времени суток форумчане! Краткость сестра таланта, по этому сразу к делу. Объясните мне пожалуйста что такое куча, что такое...

Память. Стек или куча - есть ли преимущества одного кода над другим? - C++
Здравствуйте, хотел спросить в чем различия. В чем тут недостатки и преимущества разных способов? Apple apple(); и Apple *apple = new...

58
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 01:18 #31
Добавим код с указателем, который я там кидал выше и вот такой вариант возможен:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    movl    $0, -12(%rbp)
    jmp .L2
.L3:
    leaq    -12(%rbp), %rax
    movq    %rax, -8(%rbp)
    movl    -12(%rbp), %eax
    addl    $1, %eax
    movl    %eax, -12(%rbp)
.L2:
    movl    -12(%rbp), %eax
    cmpl    $4, %eax
    setle   %al
    testb   %al, %al
    jne .L3
-8(%rbp) - наш указатель
-12(%rbp) - это i

Добавлено через 1 минуту
Цитата Сообщение от alsav22 Посмотреть сообщение
Я привык, что у переменной есть имя.
Это ты написал, чтобы мы знали, как ты привык? )) окей, кто-нибудь это учтет переменная - языковое понятие. А понятие стека уже выходит за рамки языка. Значит и "переменную" уже обсуждать можно за рамками языка. То есть то, что она есть.
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
22.02.2013, 01:18  [ТС] #32
Просто привык что информацию можно нагуглить, на википедии почитать...
Там написано про принцип LIFO, структура и все такое...
Предыдущий элемент указывает на следующий...
Но не могу понять (представить) как привязать конкретную переменную к определенному адресу...
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 01:54 #33
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от fuelcs Посмотреть сообщение
Там написано про принцип LIFO, структура и все такое...
Потому что ты не то гуглишь. гугли "стековый фрейм", фрейм стека, cdecl, fastcall, регистры и их назначение (esp, в частности).
Просто "стек" - это еще и контейнер, но уже из другой области.

Добавлено через 33 минуты
Цитата Сообщение от fuelcs Посмотреть сообщение
В общем, если в программе несколько статических переменных то есть место где хранится адрес первого элемента стека,
Не статических. Автоматических. Статические хранятся в области данных, не на стеке. Что-то пропустил я часть твоего сообщения мимо глазных яблок...
3
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
22.02.2013, 13:47  [ТС] #34
Цитата Сообщение от Vourhey Посмотреть сообщение
Статические хранятся в области данных, не на стеке.
Статические, имеется ввиду:
C++
1
static int a;
?
А переменная объявленная:
C++
1
int a;
является автоматической?
Еще вопрос, где хранятся глобальные переменные?

И в общем: код программы, статические переменные "хранятся в области данных", просто в оперативке (не в стеке не в куче)? Автоматические хранятся в стеке? Динамические в куче?

И на последок, переменные, объявленные через шаблоны, являются автоматическими и хранятся в стеке?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 17:16 #35
Цитата Сообщение от fuelcs Посмотреть сообщение
Еще вопрос, где хранятся глобальные переменные?
Отсюда: http://dvo.sut.ru/libr/cvti/i618buz/8.htm

"Область памяти, в которой размещается программа, делится на разделы по назначению и способам управления данными:

· сегмент кода используется для хранения кода программы – функций. Функции помещаются в сегмент кода на этапе компиляции программы и находятся там до завершения работы программы, поэтому все функции в C имеют глобальное время жизни и существуют в течение всего времени выполнения программы;

· статическая память (сегмент данных) предназначена для хранения переменных в течение всего времени выполнения программы. Если для переменной в какой-либо момент работы программы выделена память в сегменте данных, она там будет находиться до завершения работы программы, даже если эта переменная больше не нужна. По умолчанию в сегменте данных хранятся глобальные переменные;

· стек – это область памяти, в которой хранятся локальные переменные и параметры функций. При вызове функции ее параметры и локальные переменные помещаются в стек. Стек функционирует по принципу стакана – значение, помещенное в стек первым, оказывается на дне стека, в то время как последнее значение – на вершине стека. По завершении работы функции все данные, принадлежащие этой функции, удаляются из стека. Очистка стека начинается с вершины, т. е. со значений, помещенных в стек последними;

· динамическая память (куча) позволяет программисту управлять процессом выделения памяти под переменные и освобождением памяти. Переменные, размещаемые в динамической памяти, называются динамическими переменными."
Ещё можно здесь почитать: http://www.cyberforum.ru/blogs/18334/blog103.html
2
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
22.02.2013, 19:27 #36
alsav22, А что это
сегмент кода используется для хранения кода программы – функций. Функции помещаются в сегмент кода на этапе компиляции программы и находятся там до завершения работы программы, поэтому все функции в C имеют глобальное время жизни и существуют в течение всего времени выполнения программы;
Хм, а если глубже, то это нужно смотреть книги по архитектуре операционной системы?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 19:57 #37
Цитата Сообщение от mzarb Посмотреть сообщение
Хм, а если глубже, то это нужно смотреть книги по архитектуре операционной системы?
Может быть по ассемблеру. Там, насколько помню, тоже есть сегмент кода, сегмент данных и пр.

Добавлено через 5 минут
Код программы где-то же содержится? Это и есть сегмент кода. Данные отдельно - сегмент данных (статическая память). Стек отдельно. Динамическую память выделяет ОС. Как-то так.
2
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 22:41 #38
Цитата Сообщение от mzarb Посмотреть сообщение
А что это
Почитай про формат исполняемых файлов. Узнаешь, что такое секции.
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 17:43  [ТС] #39
Vourhey, Есть к Вам несколько вопросов...
Стек адресуется при помощи пары регистров SS:ESP. Регистр SS
(Stack Selector) содержит селектор сегмента стека при работе процессора
в защищенном режиме, ESP (Stack Pointer, указатель стека) - смещение
относительно базового адреса сегмента стека.
Мы выбираем с помощью SS сегмент памяти и ESP указывает на вершину стека внутри этого блока (сегмента памяти). Другими словами ESP (Stack Pointer, указатель стека) содержит не адрес (в понимании указатель) а только смещение относительно базового адреса?
То есть, в программе мы не работаем с физическим адресом, а с логическим?

И еще... Поскольку адресация в стеке идет от старших адресов к младшим (до 0x00000000), то размер стека ограничивается размерами сегмента памяти? Для x86 - 65536 байт? Или же стек может содержать в себе несколько сегментов памяти?

Добавлено через 2 минуты
Цитата Сообщение от Vourhey Посмотреть сообщение
-8(%rbp) - наш указатель
-12(%rbp) - это i
В ассемблере не силен... (%rbp)- это значение регистра ESP, а "-8" - это смещение относительно вершины стека?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 17:44 #40
Закопайте сегментную адресацию обратно. Регистр SS оставлен в архитектуре исключительно для совместимости. В современных ОС он перменентно равен нулю, а ESP содержит полный адрес на все 32 бита.

Цитата Сообщение от fuelcs Посмотреть сообщение
В ассемблере не силен... (%rbp)- это значение регистра ESP, а "-8" - это смещение относительно вершины стека?
Да, только регистр всё же RBP (64-битный аналог ESP) и смещение относительно RBP — текущего стек-фрейма.
1
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 17:50  [ТС] #41
~OhMyGodSoLong~, то есть размер стека неограничен? лимитируется только операционной системой? Как узнать лимит?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 17:57 #42
Да ограничивается системой. На Windows — GetCurrentThreadStackLimits(). На Linux — getrlimit().
1
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 18:48  [ТС] #43
~OhMyGodSoLong~, и все таки, для архитектуры Х86
размер стека ограничивается размерами сегмента памяти?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 19:30 #44
Цитата Сообщение от fuelcs Посмотреть сообщение
~OhMyGodSoLong~, и все таки, для архитектуры Х86
Да. Ограничен сегментом в 4 гигабайта, на начало которого в виртуальном адресном пространстве указывает SS.
0
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 20:14  [ТС] #45
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ограничен сегментом в 4 гигабайта
Не совсем понимаю... 32 битная система может адресовать 4 гигабайта памяти, верно? 4 гигабайта "виртуально" делятся на 65536 сегментов по 65536 байт каждый? SS указывает на конкретный сегмент из 65536-ти?
То есть, что бы стек занимал 4 гигабайта, нам при работе программы нужно менять содержимое регистра SS?
И отсюда можно сделать вывод что стек фрагментирован? Например, если при вызове очередной функции недостаточно памяти в сегменте (65536 байт) для размещения всего блока данных функции...
0
23.02.2013, 20:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.02.2013, 20:14
Привет! Вот еще темы с ответами:

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

Русификация.Работает-супер! Обьяснитте, как это работает? - C++
#include <iostream> #include <conio.h> #include <windows.h> using namespace std; char* Rus(const char* text); int main () ...

Объяснить как работает рекурсивная функция и стек вызовов на моем примере - C++
Объясните пожалуйста как работает рекурсивная функция и стек вызовов на моем примере. Здесь известный алгоритм "Разделяй и властвуй". Но...

Как это работает? - C++
#include <iostream> int *fun() { int a = 5; return &a; } int main() { int *ptr = fun(); std::cout <<...


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

Или воспользуйтесь поиском по форуму:
45
Ответ Создать тему
Опции темы

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