реклама на сайте
подробности

 
 
> ООП. Классы и динамические объекты, Подробности управления «кучей»
Serhiy_UA
сообщение Aug 17 2016, 10:59
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Динамические объекты создаются и уничтожаются в памяти «кучи» (heap) с помощью доступных программисту операторов new/delete. В порядке самообразования по С++ хотел бы уточнить следующие скрытые от нас подробности:
1. Действия по динамическому размещению полей данных объекта в куче выполняет прикладная программа или операционная система?
2. Если за размещение в куче ответственна ОС, то все ли из ОС поддерживают динамические объекты (и в частности для встраиваемых систем)? И как в таком случае обслуживается одновременная работа нескольких активных на данный момент программ с общей кучей, или у каждой программы своя куча?
3. Если полей данных у конкретного объекта много, то его данные размещаются в памяти непрерывно или с разрывами (перескоками), в зависимости от текущего состояния кучи ?
4. Что можно почитать на эту тему по-подробней?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
sigmaN
сообщение Aug 29 2016, 09:56
Сообщение #2


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



А дальше можно изучить мысли товарища Александреску по этому поводу
https://erdani.com/publications/cuj-2005-12.pdf
И более свежий, интересный видос
https://youtu.be/LIb3L4vKZ7U


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Serhiy_UA
сообщение Aug 30 2016, 05:12
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 721
Регистрация: 23-10-08
Из: next to Odessa
Пользователь №: 41 112



Спасибо за разъяснения.
Пока еще не все понятно, но мнение мое по этому вопросу складывается такое.
Память под «кучу» упорядочивается и представляется, как бы в виде большой кассеты с группами коробочек разных величин. При создании объекта, ему выделяется нужная по размеру коробочка, а если они закончились, то большая из ближайшей группы. Если коробочек уже не хватает, то на основе статистики о требуемых размерах памяти создают следующую кассету. Для кассеты ведется текущий реестр учета свободных и занятых коробок, по которому и выделяется указатель на свободную память. То есть, кучи, и тем более «мало-кучи» в нашем понимании, как токовой нет, а все как бы строго упорядочено и физическая память под один динамический объект все же непрерывна, а не размазана с разрывами по её разным областям.
Поправьте, если понял не так…

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 30 2016, 05:27
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Serhiy_UA @ Aug 30 2016, 08:12) *
Память под «кучу» упорядочивается и представляется, как бы в виде большой кассеты с группами коробочек разных величин.
Это всего лишь одна из очень многих стратегий. На начальном этапе вы можете об этом не задумываться. Вы просто можете пока считать, что есть некая "куча" из которой вам выделят непрерывный кусок запрошенного вами размера. Или не выделят, если непрерывного куска запрошенного размера в данный момент в куче нет.
QUOTE (Serhiy_UA @ Aug 30 2016, 08:12) *
и физическая память под один динамический объект все же непрерывна, а не размазана с разрывами по её разным областям
Это вам сказали в самом первом ответе. Как же может быть иначе? Система же не знает, что вы там хотите разместить. Но вы можете некоторые данные своего объекта хранить отдельно, в дополнительно запрашиваемой памяти. Запрашивать ее можно в конструкторе, а освобождать - в деструкторе.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 30 2016, 10:16
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Aug 30 2016, 11:27) *
Это вам сказали в самом первом ответе. Как же может быть иначе? Система же не знает, что вы там хотите разместить. Но вы можете некоторые данные своего объекта хранить отдельно, в дополнительно запрашиваемой памяти. Запрашивать ее можно в конструкторе, а освобождать - в деструкторе.

В общем случае - это не так.
Никто не мешает системе, в распоряжении которой есть MMU, сделать маппирование одного сплошного диапазона логических адресов (блока памяти выделяемого пользовательскому ПО) на несколько несмежных диапазонов физических адресов.
А вот делает-ли такое какая-то конкретная ОС или нет - не знаю.

Цитата(Сергей Борщ @ Aug 30 2016, 16:14) *
Зависит от реализации. Вменяемому менеджеру памяти ничего не мешает объединить освободившийся участок с соседними свободными.

Вменяемый может даже несмежные физические блоки объединить. Воспользовавшись услугами MMU.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Aug 30 2016, 10:51
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(jcxz @ Aug 30 2016, 13:16) *
Вменяемый может даже несмежные физические блоки объединить. Воспользовавшись услугами MMU.


Да, но на каком уровне это MMU задействуется?
Думаю что штатные менеджеры, скажем на PC, не привлекают MMU. Это слишком затратно по времени.
MMU могут привлечь для всего блока памяти кучи, но не для выделения и объединения фрагментов.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Aug 30 2016, 11:08
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AlexandrY @ Aug 30 2016, 16:51) *
Думаю что штатные менеджеры, скажем на PC, не привлекают MMU. Это слишком затратно по времени.

Ну - не очень затратно. Например: можно реализовать это в обработчике void * недостаточно_памяти(ulong требуемый_размер)
Такой обработчик может собрать имеющиеся разрозненные свободные блоки и в специально выделенном диапазоне лог. адресов построить карту перемаппирования, сохранить себе полученный лог.адрес и вернуть его. В delete надо будет конечно сделать проверку на предмет освобождения такого блока.
В некоторых случаях думаю важнее всё-таки получить память, пусть и чуть медленнее. Но медленее будет идти работа только с этими блоками, с обычными блоками - примерно так же.
Не говорю что это где-то так реализовано. Просто это возможно.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Serhiy_UA   ООП. Классы и динамические объекты, Подробности управления «кучей»   Aug 17 2016, 10:59
- - CrimsonPig   Цитата(Serhiy_UA @ Aug 17 2016, 11:59) 4....   Aug 17 2016, 11:33
|- - AlexandrY   Цитата(CrimsonPig @ Aug 17 2016, 14:33) Ч...   Aug 17 2016, 12:06
|- - SasaVitebsk   Цитата(AlexandrY @ Aug 17 2016, 15:06) Во...   Oct 3 2016, 17:18
||- - AlexandrY   Цитата(jcxz @ Aug 30 2016, 14:08) Не гово...   Aug 30 2016, 11:31
|- - AlexandrY   Цитата(Serhiy_UA @ Aug 30 2016, 08:12) Па...   Aug 30 2016, 05:56
|- - Serhiy_UA   Команд new/delete мне в работе хватает без вопросо...   Aug 30 2016, 08:03
|- - AlexandrY   Цитата(Serhiy_UA @ Aug 30 2016, 11:03) А ...   Aug 30 2016, 09:22
|- - Сергей Борщ   QUOTE (Serhiy_UA @ Aug 30 2016, 11:03) А ...   Aug 30 2016, 10:14
- - brag   На мой взгляд, самая подходящая для embedded - это...   Oct 4 2016, 17:25


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd August 2025 - 16:51
Рейтинг@Mail.ru


Страница сгенерированна за 0.01455 секунд с 7
ELECTRONIX ©2004-2016