Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Общие аспекты работы с памятью

01.06.2019, 19:37. Показов 4079. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сильно не ругайтесь если не тот раздел,не знал куда написать.
Стал я изучать работу с памятью и появилось у меня много вопросов
1. при выделении памяти для нового процесса выделяется (в x86 системах) 4 гига памяти? 2 в 32 степени байта?
2. что такое мэппинг памяти?
3. при выделении памяти для процесса для каждого создается свои стек и куча?
4. я правильно понимаю принцип работы стека? Есть два адресса - начальный адресс стека и адресс вершины стека
при добавлении переменной или чего-то другого в стек сначала высчитвается размер переменной(к примеру для int 4 байта) и т.к. стек растет от старшего до младшего бита(тоесть растет вниз) то выходит что процессор отнимает от текущего адресса вершины стека эти 4 байта и потом в стек добавляет эту переменную типа int?
4.1 если я правильно понял как работает стек тогда возник второй вопрос : память для стека заранее выделяется как-то? Если да то что будет если у нас в стеке к примеру помещается 12 байт памяти,а мы в стек пихаем еще сверху?
4.2 Если память для стека не выделяется заранее то каждый раз при добавлении элемента в стек программа управляющая памятью должна искать новый физ адресс для стека если в текущем дальше нету свободной памяти?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.06.2019, 19:37
Ответы с готовыми решениями:

Какие нужно знать аспекты C++ для работы с Unreal Engine 4?
вопрос.

Разработка мобильного приложения (общие аспекты)
Здравствуйте, уважаемые спецы. Я учусь в универе и стараюсь сам развивать свои знания, так как в универе как и на любой учебе дают...

Аспекты работы HDD
1. Возьмем такую ситуацию. Есть, например, HDD на 12 Тб (8 блинов по 1,5 ТБ), который заполнен на 95% файлами от 50 МБ до 50 ГБ. И вот все...

27
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2019, 19:57
По поводу первых трёх пунктов поиском поищи, что такое "виртуальная память". Причём сразу предупреждаю, что объяснение в три абзаца, как это принято на википедии, будет достаточно только для того, чтобы сдать зачёт, но будет недостаточно для того, чтобы понимать всю суть происходящего. Лучше об этом читать в книге. От себя могу порекомендовать Таненбаум "Современные операционные системы", раздел "3.3 Виртуальная память". Но, возможно, есть книги, где материал изложен более понятным языком. Без понимания того, что такое "виртуальная память" ты вряд ли сможешь по-настоящему понять ответы на первые три вопроса. Хотя если тебе нужно сдать зачёт, то достаточно уметь сказать умные слова, из которых как бы вытекает, что ты в теме. Этого добра тебе на форуме могут подкинуть в неограниченном количестве

Четвёртый вопрос - очень сумбурный. Понятие "стек" на разных уровнях означает как бы немного разные вещи. С уровня операционной системы - это одно, с уровня компилятора - другое, с уровня языка программирования - третье. Это разные виды абстракции. Сложно понять, что имеется в виду конкретно в твоём случае. Попробуй для начала почитать этот пост [C++] Взятие адреса конструктора. Физическое время существование объекта.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.06.2019, 20:06  [ТС]
Evg, давно кстати хотел ее прочитать всю ,много кто советовал ,вижу время настало)

Добавлено через 40 секунд
Цитата Сообщение от Evg Посмотреть сообщение
Таненбаум "Современные операционные системы"
я об этой книге если что
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.06.2019, 20:12
Цитата Сообщение от ReYalp Посмотреть сообщение
3. при выделении памяти для процесса для каждого создается свои стек и куча?
Процесс - это код и адресное пространство
Поток - это то, что выполняет код в процессе, т.е. регистры и стек. Для каждого процесса создаётся минимум один поток.
Стек создаётся для потока
Куча - это просто объект, менеджер памяти, который служит для динамического выделения памяти. Она не имеет никакого отношения ни к процессам, ни к потокам. Можно использовать несколько разных менеджеров из разных библиотек, можно написать свой, можно не использовать вообще.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.06.2019, 20:21  [ТС]
oleg-m1973, тогда возникает ещё два вопроса
1. Насколько я понимаю создаётся не обычный поток, а какой-то специальный, если нет то какая разница тогда между обычными потоками которые поддерживает процессор(к примеру процессор может поддерживать 4 потока одновременно)
2. Тоесть для каждого исполнения кода выделяется минимум 1 стек и минимум 1 куча? И как выглядит куча в физической памяти, её адрес меняется с созданием переменных? Если к примеру для начала для кучи выделили 8 байт, но я создам 3 переменных типа ин-т в динамической памяти тогда то что исполняет код должно будет найти место для этой 3 переменной и значит переместить всю кучу на другой адресс (это при условии если места дальше в текущем адресс нет), я правильно понимаю?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.06.2019, 20:48
Цитата Сообщение от ReYalp Посмотреть сообщение
1. Насколько я понимаю создаётся не обычный поток, а какой-то специальный, если нет то какая разница тогда между обычными потоками которые поддерживает процессор(к примеру процессор может поддерживать 4 потока одновременно)
Нет, такой же, как все. Процессор поддерживает сколько угодно потоков (вернее на сколько хватит памяти). Исполняет один (на ядро), в течение кванта времени ~1мс, потом переключает на другой. Т.е. на одном процессоре (ядре) потоки работают по очереди, а реально одновременно работают столько потоков, сколько ядер или процессоров,.

Добавлено через 7 минут
Цитата Сообщение от ReYalp Посмотреть сообщение
2. Тоесть для каждого исполнения кода выделяется минимум 1 стек и минимум 1 куча? И как выглядит куча в физической памяти, её адрес меняется с созданием переменных? Если к примеру для начала для кучи выделили 8 байт, но я создам 3 переменных типа ин-т в динамической памяти тогда то что исполняет код должно будет найти место для этой 3 переменной и значит переместить всю кучу на другой адресс (это при условии если места дальше в текущем адресс нет), я правильно понимаю?
Для каждого потока создаётся стек. Кучу, грубо говоря, создаёшь ты (ну или ос, по-умолчанию). Куча не зависит от потока, это просто объект в адресном пространстве процесса

Добавлено через 9 минут
Насчёт кучи немного соврал - для процесса всегда создаётся куча - всё-таки надо выделять память под стек потоков, и что-нибудь ещё
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2019, 21:16
Цитата Сообщение от ReYalp Посмотреть сообщение
1. Насколько я понимаю создаётся не обычный поток, а какой-то специальный, если нет то какая разница тогда между обычными потоками которые поддерживает процессор(к примеру процессор может поддерживать 4 потока одновременно)
Судя по всему, ты стал одной из жертв маркетологов. Термин "поток" ("thread") издавна относился к программной сущности и по своей сути обозначал одну из ветвь исполнения процесса. После того, как появились процессоры с гипертредингом, маркетологи стали использовать этот же самый термин "поток" для обозначения сущности, которую более правильно назвать "виртуальное ядро". Т.е. "потоки" в ядре не имеют вообще никакого отношения к "потокам", о которых пишет oleg-m1973. В отношении процессора это дурацкий термин, специально переиспользованный для того, чтобы вводить людей в заблуждение. Для простоты считай, что "поток" и "процесс" - это одно и то же

Цитата Сообщение от ReYalp Посмотреть сообщение
2. Тоесть для каждого исполнения кода выделяется минимум 1 стек и минимум 1 куча? И как выглядит куча в физической памяти, её адрес меняется с созданием переменных? Если к примеру для начала для кучи выделили 8 байт, но я создам 3 переменных типа ин-т в динамической памяти тогда то что исполняет код должно будет найти место для этой 3 переменной и значит переместить всю кучу на другой адресс (это при условии если места дальше в текущем адресс нет), я правильно понимаю?
"Куча" (heap) - это всего лишь термин, которым обозначается та память, которую процесс может выделить динамически в процессе исполнения. Для простоты считай, что куча - это область виртуального адресного пространства, начиная с адреса N и заканчивая адресом M. Все обращения к malloc/new будут искать свободную память в этом диапазоне адресов и каким-то (не важно, каким конкретно) образом, помечать, что такой-то диапазон адресов является занятым. А free/delete будут снимать пометку о том, что диапазон адресов занятый

И опять-таки, пока ты не понимаешь, что такое виртуальное адресное пространство и как оно связано с физической памятью, большинство из сказанного скорее всего окажется пустым звуком или близко к этому
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.06.2019, 21:21
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. "потоки" в ядре не имеют вообще никакого отношения к "потокам", о которых пишет oleg-m1973. В отношении процессора это дурацкий термин, специально переиспользованный для того, чтобы вводить людей в заблуждение. Для простоты считай, что "поток" и "процесс" - это одно и то же
А что тогда такое поток?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.06.2019, 21:21  [ТС]
Evg, нет, почему же, я понимаю что такое виртуальная память, я понимаю что это та же "замаскированная" физическая память, я понимаю что она создана для безопасности, просто мне непонятны аспекты некоторые связанные с ней
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2019, 21:27
С точки зрения операционной системы, и куча, и стек, и код программы, и данные программы - все это куски памяти, принципиально друг от друга не отличающиеся. Операционная система просто создаёт виртуальное адресное пространство и загружает в него код программы и её данные из исполняемого файла. Часть адресного пространства условно считается стеком. Условно, потому что операционной системе абсолютно по барабану, что находится по этим адресам. Она просто помечает эти адреса как законные. Ну и ещё выполняет, наверное, единственное дополнительное действие - это установка начального значения регистра, являющегося указателем стека. Что такое "куча", операционная система по большому счёту не знает вообще. Все операции над кучей осуществляются внутри виртуального адресного пространства процесса силами самогО процесса и выражаются в обращения к операционной системе "дай память". Операционная система память даёт и ей опять же по барабану, что в этой памяти размещено: куча, бублик, пряник или какая-то ещё абстракция

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А что тогда такое поток?
Который из двух?

Цитата Сообщение от ReYalp Посмотреть сообщение
я понимаю что это та же "замаскированная" физическая память
Строго говоря, нет

Если не хочешь с этим разбираться, тогда опять же для простоты считай, что у тебя на машине исполняется одна-единственная задача (процесс) и больше ничего. Высшими силами ей выделена максимально возможное количество памяти. Т.е. 2^32 байт для 32-битного режима. Процесс сам с собой договорился, что какие-то диапазоны адресов этой памяти будут называться "стек", а какие-то диапазоны - "кучей"
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.06.2019, 21:29
Цитата Сообщение от Evg Посмотреть сообщение
Операционная система просто создаёт виртуальное адресное пространство и загружает в него код программы и её данные из исполняемого файла.
Это и называется процесс.
Цитата Сообщение от Evg Посмотреть сообщение
Ну и ещё выполняет, наверное, единственное дополнительное действие - это установка начального значения регистра, являющегося указателем стека.
Это называется запуск первого потока. Этих значений регистра и указателей стека будет для процесса создано ещё много

Добавлено через 1 минуту
Цитата Сообщение от Evg Посмотреть сообщение
А что тогда такое поток?
Который из двух?
Ну, расскажи про оба.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2019, 21:43

Не по теме:

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Это с называется процесс
Мне это не надо объяснять. У ТС'а был вопрос про память в контексте процесса. Ты начал рассказывать про потоки, чем попросту ТС'а запутал. Для него "поток" - это не понятная сущность, которая совершенно избыточна в объяснениях про память. Разницы между "потоком" и "процессом" в контексте обсуждаемого вопроса попросту нет. А потому избыточное появление новых сущностей никак не прибавляет ясности

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну, расскажи про оба
Зачем? Не превращай в кашу тему (хотя она изначально обречена на то, чтоб стать кашей). Если ТС'у это понадобится в контексте конкретного вопроса, я ему расскажу. Если это детские попытки развести спор на пустом месте и доказать (видимо, мне) свою правоту, то я вообще перестану читать твои посты



Добавлено через 7 минут
Перетащил из лички, чтобы не запутаться окончательно

Цитата Сообщение от ReYalp
Но именно я не хочу понять что такое виртуальная память, точнее хочу но не конкретно это, я хочу понять как работает все выделение памяти, и стек и куча и виртуальная память
Что такое куча - я уже написал в посте #7. Это просто диапазон адресов. Допустим, от 0x1000 до 0x2000. Ты попросил "выделите память размером 4 байта", тебе вернули адрес 0x1000. Попросил ещё раз "выделите память размером 4 байта", тебе вернули адрес 0x1004. Когда ты в 0x401'й раз попросишь "выделите память размером 4 байта" тебе вернут NULL. Грубо говоря, так работает "выделение" памяти в куче. Тот, кто занимается "выделением" - это менеджер памяти, обычно это библиотечный код внутри функции malloc

Выделение памяти в стеке работает проще. Запрос "выделите память размером 4 байта" выражается в то, что из регистра, в котором хранится адрес вершины стека, вычитается 4 байта

И ещё раз подчеркну. "Виртуальная память" не имеет никого отношения к стекам и кучам. Виртуальная память - это абстракция на уровне операционной системы. Для простоты любой процесс работает в предположении, что ему доступны адреса от 0 до 2^32 и в этих адресах живёт только этот процесс и никто другой. Другие процессы живут в других вселенных. Далее каждый процесс сам с собой договаривается, что всё адресное пространство он поделит на части. Одну часть будет называть "кучей", одну часть "стеком"
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
01.06.2019, 22:11  [ТС]
Evg, ага, я думал что куча и стек выделяются как в виртуальной памяти так и в физической, просто под разными адресами,
0
88 / 108 / 6
Регистрация: 16.04.2019
Сообщений: 451
Записей в блоге: 4
01.06.2019, 22:31
Цитата Сообщение от Evg Посмотреть сообщение
0x401'й раз попросишь "выделите память размером 4 байта" тебе вернут NULL
Тут вопрос от чайника уровня ТС (или даже ниже).
1.Куча - область памяти.
2.Куча может расти.
3.Куча расположена между двумя сегментами: кодом (там ещё константы) и стеком. Причём стек и куча растут на встречу друг-другу.

И что произойдёт, когда стек и куча встретятся? Просто ошибка? Или есть способы как-то хитро увеличить размер кучи?

Добавлено через 7 минут
Цитата Сообщение от Evg Посмотреть сообщение
обращения к операционной системе "дай память". Операционная система память даёт и ей опять же по барабану, что в этой памяти размещено: куча, бублик, пряник или какая-то ещё абстракция
Или мы можем просто изменить виртуальный адрес стека? Ведь физический его адрес не изменится, таким образом, мы просто поднимаем его выше, освобождая виртуальные адреса для кучи? Я чёт запутался).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
01.06.2019, 23:34
Цитата Сообщение от IamLost Посмотреть сообщение
И что произойдёт, когда стек и куча встретятся? Просто ошибка? Или есть способы как-то хитро увеличить размер кучи?
Все адреса в пояснении виртуальные

Предположим, что начало кучи на адресе 0x1000 и она растёт вверх. А начало стека на адресе 0xffffffff и он растёт вниз. Например, с точки зрения ОС можно было бы логично какую-нибудь страницу посередине сделать невалидной. Например, страница по адресу 0x10000000 будет считаться невалдидной. Если куча до неё дорастёт, то запрос к ОС "дай память" вернёт NULL. Если до этой страницы дорастёт стек, то обращение по такому адресу сломает процесс (т.к. эту страницу мы считаем невалидной). Это очень топорно и, в общем-то высосано из пальца, но, например, это могло быть именно так. Здесь пояснена лишь общая суть, а не то, как устроено в реальности

Цитата Сообщение от IamLost Посмотреть сообщение
Или мы можем просто изменить виртуальный адрес стека?
Стек - это всего лишь договорное соглашение. Ты можешь выделить malloc'ом память, записать в указатель стека хвостовой адрес выделенной памяти и у тебя как бы всё будет работать. Программе пофигу, по каким адресам находится стек, она продолжит работать (при условии, что работа с новым "стеком" не вылезет за границу памяти, выделенной malloc'ом)

Ты можешь вообще ничего в куче не выделять. Можешь в программе написать переменную "char a[1024*1024];" и записать в указатель стека хвостовой (или вообще серединный) адрес. И точно так же всё будет работать

Т.е. стек - это некое программное соглашение и не более того. Если его настроить куда-то в другое место, не нарушая соглашений, то всё по прежнему будет работать

Аналогичным образом если malloc вдруг начнёт возвращать адреса, соответствующие ещё не занятому стеку, то точно так же всё будет нормально работать. Разумеется, при условии, что настоящий стек до этих адресов не дорастёт

Другими словами, с точки зрения операционной системы стеку и куча - не более чем страницы памяти в виртуальном пространстве процесса. Хотя там могут быть какие-то тонкости, упирающиеся в программные соглашения между разными программными компонентами. Например, в случае возникновения прерывания происходит передача управления ядру ОС, а оно предполагает, что в момент прерывания у процесса были некоторые настройки стека, которые требуется сохранить, а потом восстановить. Если мы вели свой собственный стек с нарушением программных соглашений, то ядро может сохранить не то или не туда и т.п. и после прерывания не будет восстановлено изначальное состояние
2
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
02.06.2019, 02:06  [ТС]
Evg, мне интересно как они располагаются относительно друг к другу, сегодня прочитал что в физической памяти они могут быть расположены вообще в разных местах, как они могут расти один к одному в этом случае?или просто если к примеру на програму выделяется 2гб и размер кучи + стека будет >2гб то тогда просто ошибка вылетит?

Добавлено через 2 часа 5 минут
Заданный выше вопрос отпал, просто не заметил выше ответ, судя из вышесказанного я не могу понять какая разница между кучей тогда и стеком? (кроме того что стек это lifo и память растёт от старшего бита к младшему и что переменные записанные в кучу видны не только в процедуре, а и во всем процессоре(этот момент тоже мне не ясен почему так) )
И вот вопрос который именно меня интересовал но я не знал толком как работает виртуальная память, но теперь я понял уже что это более менее и собственно вопрос :
Представим что у нас есть физическая память в которой находится стек, насколько я понимаю для него же должна выделяться память заранее, как ОС определяет сколько памяти стеку выделить, так же и для кучи, и что будет если представим будет такая ситуация что ОС нужно будет выделить потоку(процессу) 2 гб памяти, но в памяти ОС останется только к примеру 10 мест по 200мб,ято в этом случае? Я спрашивал можно ли именно "разорвать" стек или кучу?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.06.2019, 10:03
Цитата Сообщение от ReYalp Посмотреть сообщение
Evg, мне интересно как они располагаются относительно друг к другу, сегодня прочитал что в физической памяти они могут быть расположены вообще в разных местах, как они могут расти один к одному в этом случае?
В очередной раз говорю. Пока ты не поймёшь, что такое виртуальная память, у тебя так и будет "смотришь в фигу - видишь фигу", "слышишь звон, да не знаешь где он" и т.п. Пока ты не поймёшь, что виртуальная память перпендикулярна к стеку и куче, с тобой будет сложно разговаривать

Цитата Сообщение от ReYalp Посмотреть сообщение
какая разница между кучей тогда и стеком?
Накакой. Я уже говорил, что это всего лишь договорённость. И то и другое - обычная память, просто находится по разным виртуальным адресам

Цитата Сообщение от ReYalp Посмотреть сообщение
стек это lifo
Это очень условное lifo. Представь себе реализацию стека (я имею в виду аглоритмическую структуру данных) в виде массива int'ов. Логически тебе доступен только верхний элемент и операции засунуть/высунуть. Технически тебе доступен любой элемент. Стек, о котором ты говоришь - по своей сути такой же. Единственное отличие - элементом является не int, а кусок памяти произвольного размера, который требуется одной функции для хранения своих данных

Стек - НЕ является аппаратной фичей и НЕ является какой-то сущностью, реализуемой операционной системой. Это всего лишь кусок памяти со сплошной виртуальной адресацией. В нём есть две программные сущности "stack pointer" и "frame pointer", которые процесс ведёт своими силами, без помощи операционной системы и железа, как если бы это был обычный абстрактный стек, реализованный при помощи массива int'ов. Принципиальной разницы нет никакой. Stack pointer - указывает на вершину стека. Элементами стека у нас являются куски памяти (frame'ы), используемые процедурами. Frame pointer - это указатель на начало или конец такого куска, относительно которого организуется доступ до отдельных переменных внутри frame'а. И опять-таки всё это - исключительно на уровне программных соглашений. Так работают компиляторы. Тебе никто не мешает написать программу на ассемблере, в котором стек будет представлять собой помойку, организованную по твоим правилам. Здесь нет никакой обязаловки, за исключением того, что нужно будет соблюдать программные соглашения на стыке между твоей программой и ядром операционной системы. Либо написать свою собственную операционную систему, которая будет жить по твоим правилам. Аппаратуре вообще пофигу (строго говоря, это не так, но в первом приближении считай, что так)

Цитата Сообщение от ReYalp Посмотреть сообщение
Представим что у нас есть физическая память в которой находится стек, насколько я понимаю для него же должна выделяться память заранее, как ОС определяет сколько памяти стеку выделить, так же и для кучи
Размер стека при запуске процесса - это программное соглашение. Как договорятся, так и будет. В unix'овых системах приказом "ulimit -s <size>" можно этот параметр настроить

Для кучи на момент запуска программы не выделяется память вообще. Эту память заказывает сам процесс по мере необходимости. Т.е. в процессе работы процесс периодически обращается к операционной системе с запросом "дай память"

И опять-таки всё это - чисто вопрос договорённостей. За многие годы выработались именно такие программные соглашения, потому что именно такой подход показался наиболее эффективным. Тебе никто не мешает разработать собственную систему, в которой память для кучи выделяется на этапе запуска программы и имеет фиксированный размер, а стек будет выделяться запросами "дай память". Аппаратуре побоку - всё это будет нормально работать, хоть и будет менее эффективно

Цитата Сообщение от ReYalp Посмотреть сообщение
и что будет если представим будет такая ситуация что ОС нужно будет выделить потоку(процессу) 2 гб памяти, но в памяти ОС останется только к примеру 10 мест по 200мб,ято в этом случае? Я спрашивал можно ли именно "разорвать" стек или кучу?
Да прочитай же ты наконец про виртуальную память. А если не хочешь читать, то введи себе абстракцию, которую я описывал в посте #10 в последнем абзаце и не вылезай за рамки этой абстракции. Потому что с точки зрения процесса всё выглядит именно так. А твой вопрос - это то, что выходит за рамки этой абстракции и решается операционной системой через понятие "виртуальная память". Пользовательский процесс про это ничего не знает. Он думает, что живёт внутри сплошного (неразрывного) адресного пространства
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.06.2019, 11:09
Цитата Сообщение от ReYalp Посмотреть сообщение
судя из вышесказанного я не могу понять какая разница между кучей тогда и стеком?
Стек - это массив фиксированного размера (std::array), куча - это, грубо говоря, список блоков памяти (std::list<std::vector>>).

Добавлено через 8 минут
Размер стека задаётся при создании потока, в CreateThread. Для первого потока в процессе - либо в CreateThread, STACK_SIZE_PARAM_IS_A_RESERVATION, либо в параметрах компилятора.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
02.06.2019, 11:55  [ТС]
Evg, от чего зависти тогда размер выделенной физической памяти под стек? И я спрашиваю именно о физической памяти, как она работает, если для кучи памяти вообще не выделяется то тогда по мере создания динамических объектов она начнёт выделяться, как это будет происходит? Кусок за куском(последовательно), или сразу целый блок памяти, иил что?
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
02.06.2019, 14:06
Цитата Сообщение от ReYalp Посмотреть сообщение
Evg, от чего зависти тогда размер выделенной физической памяти под стек? И я спрашиваю именно о физической памяти
Устал повторять - разберись, что такое виртуальная память. Такие глупые вопросы сами собой отпадут
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2019, 14:06
Помогаю со студенческими работами здесь

Общие принципы работы с прогрессбаром
Ребята здравствуйте! подскожите пожалуйсто каким методом, (кроме конечно тыка) можно регулировать скорость и узнавать сколько прибавить или...

Ошибка работы с памятью
Добрый день, прошу вашей помощи.Пишу программу кодировки RC4. Пишу функцию перевода из букв в численные значения, т.е ищу номер букв в...

функции работы с памятью
нужно реализовать свою функцию memcpy. #include &lt;iostream&gt; using std::cout; using std::endl; using std::cin; void*...

Общие принципы работы с набором данных
Общие принципы работы с набором данных

Трудоустройство и условия работы. Общие моменты
Не нашёл такой темы, и честно говоря, удивлён. Конечно, интересны конкретные предложения. Но хотелось бы обсудить &quot;вообще&quot; такие...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru