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

Стек и куча - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.94
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
21.02.2013, 23:13     Стек и куча #1
Добрый вечер, подскажите пожалуйста хорошую литературу (сайты) по куче и стеку. Как оно все работает?
Насколько я понял все статические переменные лежат в стеке. К примеру в программе есть несколько переменных: а, б и с. Значит где-то должен хранится адрес каждой из них? Как осуществляется доступ к переменным?
Указатели (переменные) к примеру хранятся в стеке?
Вообщем вопрос один где про это все толково написано?
Спасибо за все хорошие источники...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 17:50  [ТС]     Стек и куча #41
~OhMyGodSoLong~, то есть размер стека неограничен? лимитируется только операционной системой? Как узнать лимит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 17:57     Стек и куча #42
Да ограничивается системой. На Windows — GetCurrentThreadStackLimits(). На Linux — getrlimit().
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 18:48  [ТС]     Стек и куча #43
~OhMyGodSoLong~, и все таки, для архитектуры Х86
размер стека ограничивается размерами сегмента памяти?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 19:30     Стек и куча #44
Цитата Сообщение от fuelcs Посмотреть сообщение
~OhMyGodSoLong~, и все таки, для архитектуры Х86
Да. Ограничен сегментом в 4 гигабайта, на начало которого в виртуальном адресном пространстве указывает SS.
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 байт) для размещения всего блока данных функции...
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 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 гигабайта длиной, хоть в один байт. Харварные возможности ограничивать размеры стека есть, но на них все клали прибор, потому что есть страницы.
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 23:05  [ТС]     Стек и куча #47
~OhMyGodSoLong~, спасибо)
ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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 в кучу
 
}
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
23.02.2013, 23:25  [ТС]     Стек и куча #49
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
где хранится размер сегмента [20 бит]
а почему размер сегмента 20 бит а не 32 бита?

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

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

Не по теме:

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

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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 Посмотреть сообщение
int *p=new int[10];
где то в куче выделили память допустим по адресу 100000
в p(который лежит в стеке) записалось 100000 это адрес памяти который выделен в куче

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

Не по теме:

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

ValeryS
Модератор
6374 / 4840 / 441
Регистрация: 14.02.2011
Сообщений: 16,042
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
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
23.02.2013, 23:56     Стек и куча #53
Цитата Сообщение от fuelcs Посмотреть сообщение
а почему размер сегмента 20 бит а не 32 бита?
Потому что когда-то компьютеры были маленькими и память у них была маленькой, аж максимум на 1 мегабайт. И никто тогда не думал о том, как потом расширять размеры сегмента; типа, кому будет надо, тот заплатит и мы чего-нибудь придумаем. Ну вот и придумали тот самый битик, который говорит, что или меряется размер в байтах (тогда сегмент максимум на мегабайт, 220), или в кусках по 4 килобайта (тогда сегмент максимум на 212 + 20, на 4 гигабайта).

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

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

Добавлено через 2 минуты
~OhMyGodSoLong~, теперь ясно
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
13.06.2013, 15:49     Стек и куча #55
Может кто еще обьяснит в чем разница между регистром RBP и RSP? Хотя бы, что именно хранится в одном и в другом и как это все связано и взаимодействует?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.06.2013, 16:01     Стек и куча #56
rsp хранит текущую верхушку стека
rbp - предыдущий стековый фрейм
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
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" я так и не смог...
fuelcs
12 / 12 / 0
Регистрация: 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.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2013, 17:06     Стек и куча
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
D.E.S.P.E.R.O.
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 0
Регистрация: 12.03.2009
Сообщений: 110
Завершенные тесты: 1
13.06.2013, 17:06     Стек и куча #59
fuelcs, большое спасибо! Очено ценная информация!
Yandex
Объявления
13.06.2013, 17:06     Стек и куча
Ответ Создать тему
Опции темы

Текущее время: 10:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru