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

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

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

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

21.02.2013, 23:13. Просмотров 7385. Ответов 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, 00:25 #16
Цитата Сообщение от palva Посмотреть сообщение
Если у вас несколько подобных циклов, то переменная i всех трех будет размещаться в одной области памяти
Это тоже далеко не факт
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 00:27 #17
Цитата Сообщение от fuelcs Посмотреть сообщение
int i остается статической переменной
При чём здесь область видимости? Статические переменные хранятся в статической памяти. i - автоматическая переменная, живущая до выхода из for().
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 00:28 #18
Цитата Сообщение от alsav22 Посмотреть сообщение
живущая до выхода из for()
До выхода из for живет имя языкового уровня на стадии компиляции. А не переменная, как область в памяти. Все up to компилятор.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 00:32 #19
Цитата Сообщение от Vourhey Посмотреть сообщение
До выхода из for живет имя языкового уровня на стадии компиляции. А не переменная, как область в памяти.
То есть, при выходе из for() память под i не объявляется свободной?
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 00:34 #20
Цитата Сообщение от alsav22 Посмотреть сообщение
То есть, при выходе из for() память под i не объявляется свободной?
Нет в случае со стеком она вообще не может быть свободной и занятой.
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 00:37 #21
Цитата Сообщение от Vourhey Посмотреть сообщение
Нет в случае со стеком она вообще не может быть свободной и занятой.
Сформулирую по другому: то есть, при выходе из for() переменная i подолжает существовать в стеке?
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 00:39 #22
Цитата Сообщение от alsav22 Посмотреть сообщение
то есть, при выходе из for() переменная i подолжает существовать в стеке?
Конечно.

Добавлено через 1 минуту
Поменяй свой код на такой, если хочешь проверить:
C++
1
2
3
4
    int *a;
    for (int i = 0; i < 5; i++)
    {a = &i;}
   cout<<*a;
Добавлено через 38 секунд

Не по теме:

код не компилял, сорри, если где опечатался

1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 00:40 #23
Цитата Сообщение от Vourhey Посмотреть сообщение
Конечно.
И я могу с ней работать?
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 00:40 #24
Цитата Сообщение от alsav22 Посмотреть сообщение
И я могу с ней работать?
Почему бы и нет.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 00:47 #25
Тогда вопрос общего характера: что есть переменная? Область в памяти, или именованная область в памяти, или что ещё?
1
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 00:51 #26
Цитата Сообщение от alsav22 Посмотреть сообщение
что есть переменная? Область в памяти или именованная область в памяти?

Не по теме:

"Переменная" - это вопрос субъективного восприятия так же, как и константы, ссылки и так далее. Кто, на каком уровне привык воспринимать, тот так и понимает.

1
fuelcs
12 / 12 / 0
Регистрация: 23.01.2013
Сообщений: 143
22.02.2013, 01:00  [ТС] #27
Цитата Сообщение от Vourhey Посмотреть сообщение
Тебе так же нужно знать смещение от начала массива в стеке, как в предыдущем примере
В общем, если в программе несколько статических переменных, то есть место где хранится адрес первого элемента стека, плюс дополнительная память где храниться смещение каждой переменной относительно адреса первой?
Для массивов есть смещение только для первого (нулевого) элемента, а с итым разбирается компилятор?

Добавлено через 5 минут
Не могу понять как работает стек...
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 01:02 #28
http://dvo.sut.ru/libr/cvti/i618buz/8.htm
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,536
22.02.2013, 01:16 #29
Цитата Сообщение от fuelcs Посмотреть сообщение
то есть место где хранится адрес первого элемента стека, плюс дополнительная память где храниться смещение каждой переменной относительно адреса первой?
Не совсем. Во первых, это зависит от компилятора, как будет вестись обращение к твоеим переменным, через указатель стека (ESP), или через адрес на начало локальных данных (часто в EBP хранится), или через что-нибудь еще. Стек растет от больших адресов к меньшим. Поэтому обращение к данным от их "начала" это операция "минус", а не "плюс".
Цитата Сообщение от fuelcs Посмотреть сообщение
Для массивов есть смещение только для первого (нулевого) элемента, а с итым разбирается компилятор?
Вопрос не понял.

Добавлено через 20 секунд
Цитата Сообщение от fuelcs Посмотреть сообщение
Не могу понять как работает стек...
Ща...

Добавлено через 2 минуты
Цитата Сообщение от fuelcs Посмотреть сообщение
Не могу понять как работает стек...
Может, те все-таки книжку почитать?

Добавлено через 1 минуту
Например, в этой книге: http://www.ozon.ru/context/detail/id/2631566/ все это описано.

Добавлено через 1 минуту
Вот пример кода сгенерированного компилятором для того примера с пустым циклом:
Assembler
1
2
3
4
5
6
7
8
9
    movl    $0, -4(%rbp)
    jmp .L2
.L3:
    addl    $1, -4(%rbp)
.L2:
    cmpl    $4, -4(%rbp)
    setle   %al
    testb   %al, %al
    jne .L3
Обращение через -4(%rbp) к этой переменной.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.02.2013, 01:16 #30
Цитата Сообщение от Vourhey Посмотреть сообщение
Кто, на каком уровне привык воспринимать, тот так и понимает.
Я привык, что у переменной есть имя.
0
22.02.2013, 01:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2013, 01:16
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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