Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/70: Рейтинг темы: голосов - 70, средняя оценка - 4.90
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый вечер, подскажите пожалуйста хорошую литературу (сайты) по куче и стеку. Как оно все работает?
Насколько я понял все статические переменные лежат в стеке. К примеру в программе есть несколько переменных: а, б и с. Значит где-то должен хранится адрес каждой из них? Как осуществляется доступ к переменным?
Указатели (переменные) к примеру хранятся в стеке?
Вообщем вопрос один где про это все толково написано?
Спасибо за все хорошие источники...
2
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.02.2013, 23:13
Ответы с готовыми решениями:

Статика и динамика, стек и куча - что это
Помогите пожалуйста хорошей статьей какой нибудь, или советом :) интересуют такие банальные...

Как стек и куча связаны с переменными динамической и статической памятью
Небольшой казус в голове (на самом деле большой). Смотрел реализацию стека и кучи как структур...

как все это в подробностях работает?
#include <iostream> #include<cstdlib> using namespace std; int main() {...

стек и куча
Здравствуйте, уважаемые гуру! Подскажите, пожалуйста, как подобрать размер стека и кучи. ...

58
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 17:50  [ТС] 41
Author24 — интернет-сервис помощи студентам
~OhMyGodSoLong~, то есть размер стека неограничен? лимитируется только операционной системой? Как узнать лимит?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 17:57 42
Да ограничивается системой. На Windows — GetCurrentThreadStackLimits(). На Linux — getrlimit().
1
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 18:48  [ТС] 43
~OhMyGodSoLong~, и все таки, для архитектуры Х86
размер стека ограничивается размерами сегмента памяти?
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 19:30 44
Цитата Сообщение от fuelcs Посмотреть сообщение
~OhMyGodSoLong~, и все таки, для архитектуры Х86
Да. Ограничен сегментом в 4 гигабайта, на начало которого в виртуальном адресном пространстве указывает SS.
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 20:14  [ТС] 45
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Ограничен сегментом в 4 гигабайта
Не совсем понимаю... 32 битная система может адресовать 4 гигабайта памяти, верно? 4 гигабайта "виртуально" делятся на 65536 сегментов по 65536 байт каждый? SS указывает на конкретный сегмент из 65536-ти?
То есть, что бы стек занимал 4 гигабайта, нам при работе программы нужно менять содержимое регистра SS?
И отсюда можно сделать вывод что стек фрагментирован? Например, если при вызове очередной функции недостаточно памяти в сегменте (65536 байт) для размещения всего блока данных функции...
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 22:52 46
Цитата Сообщение от fuelcs Посмотреть сообщение
Не совсем понимаю... 32 битная система может адресовать 4 гигабайта памяти, верно? 4 гигабайта "виртуально" делятся на 65536 сегментов по 65536 байт каждый? SS указывает на конкретный сегмент из 65536-ти?
Вот пусть у нас защищённый режим. Есть SS (16 битов), где хранится селектор сегмента. Селектор состоит из номера записи в таблице сегментов (13 битов), бита с типом таблицы (локальная/глобальная) и ещё двух битов с правами на чтение/запись. В таблице хранятся записи, каждая по 64 бита (где хранится размер сегмента [20 бит], адрес начала сегмента [32 бита], флажок с единицей измерения размера сегмента [1 байт или 212 байтов], и ещё пачка зарезервированных/неиспользуемых битов).

И есть ESP (32 бита), который указывает на смещение верхушки стека в этом сегменте относительно его начала.

Сегмент стека может быть хоть на все 4 гигабайта длиной, хоть в один байт. Харварные возможности ограничивать размеры стека есть, но на них все клали прибор, потому что есть страницы.
1
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 23:05  [ТС] 47
~OhMyGodSoLong~, спасибо)
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
23.02.2013, 23:14 48
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет в случае со стеком она вообще не может быть свободной и занятой.
позвольте с вами не согласится
конечно как такого объявления "свободная" занятая в стеке нет
но
C++
1
2
3
for(int i=0;i<10;i++)//  i лежит в стеке
{}
int b=5;//b спокойно может лечь на место i,зависит от компилятора
мне кажется что ТС не понимает разницу между статическими и локальными(автоматическими) переменными
статические переменные лежат там же где и глобальные в области данных
попытаюсь проиллюстрировать
C++
1
2
3
4
5
6
7
8
9
10
int a; // глобальная переменная лежит в области данных
void fnc()
{
int b; //локальная лежит в стеке
static int c=0;// статическая лежит в области данных рядом с a
int *p=new int[10];//указатель p лежит в стеке а память выделяется в куче
 
p[5]=10;//здесь мы взяли указатель p из стека добавили к нему смешение 5 и по полученному адресу записали 10 в кучу
 
}
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 23:25  [ТС] 49
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
где хранится размер сегмента [20 бит]
а почему размер сегмента 20 бит а не 32 бита?

Добавлено через 3 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
p[5]=10;//здесь мы взяли указатель p из стека добавили к нему смешение 5 и по полученному адресу записали 10 в кучу
а фактически смещение равно 5 или 20?

Добавлено через 2 минуты

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
мне кажется что ТС
что значит ТС?

0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
23.02.2013, 23:35 50
Цитата Сообщение от fuelcs Посмотреть сообщение
а фактически смещение равно 5 или 20?
нет такого фактически
смешение на 5 int-ов
в 32 разрядной ОС 20 байт (int 4 байта)
в 16 разрядной на 10(int 2 байта)
в 64 разрядной 40 (int 8 байта)

Добавлено через 57 секунд
Цитата Сообщение от fuelcs Посмотреть сообщение
что значит ТС?
Топик Стартер
человек который создал тему, в данном случае ты

Добавлено через 7 минут
попытаюсь объяснить по другому

Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
int *p=new int[10];
где то в куче выделили память допустим по адресу 100000
в p(который лежит в стеке) записалось 100000 это адрес памяти который выделен в куче

Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
p[5]=10;
к 100000 прибавили 5*размер int (возьмем 4 для 32 разрядных) получился адрес 100020
и вот по этому адресу записываем 10
0
fuelcs
23.02.2013, 23:38  [ТС]
  #51

Не по теме:

Цитата Сообщение от ValeryS Посмотреть сообщение
в 64 разрядной 40 (int 8 байта)
наверное глупый вопрос, диапазон значений переменной зависит от разрядности системы?

0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,519
23.02.2013, 23:41 52
Цитата Сообщение от fuelcs Посмотреть сообщение
наверное глупый вопрос, диапазон значений переменной зависит от разрядности системы?
конечно
в 16 разрядной под int 16 бит
для беззнаковой 2 в 16 степени
для знаковой -2 в 15 +2 в 15

в 32 разрядной под int 32 бит
для беззнаковой 2 в 32 степени
для знаковой -2 в 31 +2 в 31

в 64 разрядной под int 64 бит
для беззнаковой 2 в 64 степени
для знаковой -2 в 63 +2 в 63
0
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 23:56 53
Цитата Сообщение от fuelcs Посмотреть сообщение
а почему размер сегмента 20 бит а не 32 бита?
Потому что когда-то компьютеры были маленькими и память у них была маленькой, аж максимум на 1 мегабайт. И никто тогда не думал о том, как потом расширять размеры сегмента; типа, кому будет надо, тот заплатит и мы чего-нибудь придумаем. Ну вот и придумали тот самый битик, который говорит, что или меряется размер в байтах (тогда сегмент максимум на мегабайт, 220), или в кусках по 4 килобайта (тогда сегмент максимум на 212 + 20, на 4 гигабайта).

Вот из таких костылей (конкретно этот — это ещё чуть ли не образец изящества) и состоит вся архитектура x86. Потому что Intel любит обратную совместимость.

Кстати, лишние 4 бита там тоже костылём прикручены. Раньше он был вообще на 16 бит.
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 23:59  [ТС] 54
размер сегмента 20 бит
я правильно понимаю:
20 бит это 2^20=1 мегабайт?
То есть максимальный размер сегмента 1 мегабайт?

Добавлено через 2 минуты
~OhMyGodSoLong~, теперь ясно
0
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
13.06.2013, 15:49 55
Может кто еще обьяснит в чем разница между регистром RBP и RSP? Хотя бы, что именно хранится в одном и в другом и как это все связано и взаимодействует?
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
13.06.2013, 16:01 56
rsp хранит текущую верхушку стека
rbp - предыдущий стековый фрейм
1
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
13.06.2013, 16:09 57
Просто в англоязычном источнике так скользко описано:
RBP is the base pointer, which points to the base of the current stack frame.
RSP is the stack pointer, which points to the top of the current stack frame.
И если в случае с RSP все более-менее понятно, то интерпретировать понятие "base of the current stack frame" я так и не смог...
0
12 / 12 / 2
Регистрация: 23.01.2013
Сообщений: 143
13.06.2013, 16:46  [ТС] 58
D.E.S.P.E.R.O.,
может это поможет...

SP/ESP/RSP: Stack pointer for top address of the stack.
BP/EBP/RBP: Stack base pointer for holding the address of the current stack frame.
1
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
13.06.2013, 17:06 59
fuelcs, большое спасибо! Очено ценная информация!
0
13.06.2013, 17:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.06.2013, 17:06
Помогаю со студенческими работами здесь

Стек и куча
Всем привет. Только что вычитал из Tproger статью про стеки и кучи....

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

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

Тип данных String. Как это все работает?
Здравствуйте. Я только начал изучать этот замечательный язык, но столкнулся с проблемой --&gt; моим...


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

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru