Посоветуйте функцию для с++ для ОС Windows7 которая может просить память из кучи она должна быть ниже new или maloc24.10.2020, 22:12. Показов 5533. Ответов 34
Метки нет (Все метки)
Я хочу написать свой алгоритм распределения памятью, есть свои идеи которые не реализованы в таких функциях как
new и других которые содержаться в STL, мне нужна функция которая будет запрашивать сырую память из кучи, и даже было бы хорошо если это память не будет инициализирована а будет поставлена в сыром виде как есть. Посоветуйте что-нибудь такое.
0
|
|
| 24.10.2020, 22:12 | |
|
Ответы с готовыми решениями:
34
Память не может быть Written или Read
|
|
Модератор
|
|
| 25.02.2021, 19:58 | |
|
Все гигабайты виртуального адресного пространства у каждого процесса свои. Свои таблицы соответствия страниц физической памяти в машине и виртуального адресного пространства процесса. ОС также помнит, из какого места какого файла можно прочитать данные или инструкции, содержащиеся в странице виртуального пространства процесса ( и куда сохранить изменённые данные, если в физической памяти выполняющемуся процессу они пока не нужны ).
Т.о. по одним и тем же виртуальным адресам в одном процессе может вообще ничего не быть, в другом - зарезервированное, но неиспользуемое пространство, в третьем - одна страница физической памяти, в четвёртом - другая, в пятом - страница из DLL, отсутствующая в физической памяти. А одна и та же страница физической памяти может быть расположена сразу по нескольким виртуальным адресам в одном процессе, и по другим - в остальных процессах. "Рабочие наборы" в Подробностях "Диспетчера задач" - это физические страницы, которые в данный момент используются процессом. Если сами напишете realloc(), можете написать функцию, проверяющую, есть ли место для увеличения региона. Если есть какой-то HeapWalk, можно и с "чужим" realloc'ом сделать то же самое. Но для этого придётся частично выполнить аналог realloc() (до увеличения размера).
0
|
|
| 25.02.2021, 22:12 [ТС] | |||
realloc(), к самой же HeapAlloc() у меня вопросов не возникает, тут по ходу нужно опускаться ещё ниже HeapAlloc и собирать запрос памяти у системы своими алгоритмами, а на это к сожалению нет времени пока что, такие функции мне предлагали но я с ними не разобрался до конца не хватает информации.Добавлено через 4 минуты HeapAlloc()?
0
|
|||
|
Модератор
|
|
| 26.02.2021, 06:27 | |
|
А сколько может потребоваться?
Самый простой и эффективный способ запросить память у системы -- объявить в своей программе большой статический неинициализированный массив (или несколько массивов) и потом динамически нарезать из него куски требуемого размера своими средствами. С malloc()/HeapAlloc() тоже можно так сделать ( вообще не вызывать HeapFree() или вызывать один раз при завершении процесса). Но тогда всё равно будут накладные расходы на управление кучей.
0
|
|
| 26.02.2021, 06:47 [ТС] | ||
|
0
|
||
|
Модератор
|
|||||||||||||||||
| 26.02.2021, 12:59 | |||||||||||||||||
|
Если процесс никак не использует страницы, выделенные загрузчиком для массива ( не читает и не изменяет страницы), то и физическая память для них не используется.
Если же не хочется даже резервировать место "в файле подкачки", то можно зарезервировать сплошной участок с помощью VirtualAlloc(), но коммитать его только по pagefault'ам при первой попытке обращения к выделенной странице.Проще настроить систему, чтобы для Ваша задача не устраивала сюрпризов в процессе работы из-за неожиданной нехватки памяти. Добавлено через 9 минут Ограничение MSVC для массива фактически около 02'00000'00000 - 1000Добавлено через 27 минут _expand(), которая никогда не перемещает.https://docs.microsoft.com/ru-... nce/expand
0
|
|||||||||||||||||
| 26.02.2021, 19:50 [ТС] | |||
realloc(), который тоже делает что-то подобное. При создании кучи всё равно отдаётся страница на 4096 байт. Дело в том что если бы я собрал функции выделения памяти начиная с самого низа то они бы были очень развиты и я бы знал как они работают и сделал бы их быстрее а так не понятно насколько быстро HeapAlloc(),при выделении нового блока копирует данные и многое другое.
0
|
|||
|
Модератор
|
|
| 27.02.2021, 14:13 | |
|
Ни процесс, ни кто-либо ещё не могут в общем случае знать, понадобится ли вызвать ту или иную функцию из того или иного модуля.
Поэтому нет никакого смысла заранее копировать в RAM весь код и даные из файлов EXE и DLL. Физическая память для страницы, содержащей код функции, при необходимости выделится при попытке вызова этой функции процессом. И, рано или поздно, освободится, если ни один процесс этод код больше не использует, а страница физической памяти, например, понадобилась зачем-то другой программе. То же самое и с данными. Неважно, располагаются ли они в программных секциях или сегментах DLL, стеках, кучах, или каких-то других файлах, спроецированных по запросу программы в адресное пространство процесса.
0
|
|
| 27.02.2021, 15:31 [ТС] | ||
Виртуальные страницы, а за тем на Таблицы сопоставления виртуальной памяти с физической то не факт что массивы лежат в статических позициях, вполне возможно что если память постоянно куда-то выделяется то сначала ваш массив лежит в одном месте а мы думаем что он имеет постоянный адрес, а затем система может сфрагментировать некоторые куски чтобы блоки были не разрывными и за кулисами адрес может поменяться а со стороны виртуальных страниц он может оказаться одинаковым потому что мы через него и прочие алгоритмы выходим на физическую память.Я читал про сборщик мусора там описан этот процесс. Вполне возможно даже что и сам массив расположен не линейно доказательств конечно нет, я не знаю станет ли система делить блок на части. Но самому такое реализовать можно конечно. И всё же вопрос о том сколько всего физической памяти осталось по прежнему актуален. Возможно если запросишь больше чем есть система даст указатель, но вылеты у меня были значит предел есть.
0
|
||
|
Модератор
|
||
| 27.02.2021, 16:10 | ||
|
Виртуальные адреса внутри процесса адресуемых объектов программмы на С++ для Windows не меняются.
Физичиские адреса большинству страниц большую часть времени не назначены, назначаются и изменяются системой невидимо для программы. Физическую память функциями стандартной библиотеки программа на С++ запросить у Windows напрямую не может. Выделение и освобождение происходит автоматически. Добавлено через 2 минуты
0
|
||
| 27.02.2021, 17:00 [ТС] | |||
|
Видимо по этой причине система сама не знает сколько свободной памяти есть в наличии, она может и быть а может и не быть может состоять в резерве а может и не состоять, она может быть занятой но адреса могут быть и не назначены. Да интересно.
0
|
|||
|
Модератор
|
|
| 27.02.2021, 17:16 | |
|
0
|
|
|
Модератор
|
|||||||||||||||||||||
| 01.03.2021, 20:26 | |||||||||||||||||||||
|
В страницах кучи может быть суммарно достаточно свободных участков, но, из-за злоупотребления HeapAlloc() и HeapFree(), свободные пространство может быть фрагментировано,
и в страницах кучи остсутвовать непрерывный свободный блок нужного размера. Поэтому HeapAlloc() будет пытаться добавить к куче непрерывный блок новых страниц. Если в адресном пространстве процесса найдётся подходящая свободная область, что бывает почти всегда для 64-разрядных процессов, для успшеного расширения кучи необходимо ещё свободное место на магнитном барабане, так как HeapAlloc() вызывает VirtualAlloc() с флагом MEM_COMMIT.Чтобы показать общие сведения о доступной памяти в окне "О программе" была старая функция GlobalMemoryStatus()
Можно получить интересующие подробности использования памяти процессом и системой в целом другими функциями https://docs.microsoft.com/en-... nformation
1
|
|||||||||||||||||||||
| 21.12.2022, 02:42 [ТС] | |
|
Я здесь провёл серию экспериментов https://www.cyberforum.ru/post16650702.html, также пост выше по ссылке тоже довольно интересный.
0
|
|
| 22.12.2022, 18:59 [ТС] | |
|
Кто тестировал функцию
HeapCompact? В инструкции написано что она объединяет кучи в один блок внутри одного дескриптора, правда ли это? Ссылка https://learn.microsoft.com/en... eapcompact
0
|
|
| 22.12.2022, 18:59 | |
|
Напишите функцию, которая выделяет память для двумерной матрицы из целых чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
|
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
|
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ
Основная суть и тезисы по измерениям:
0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема.
Объект не может перемещаться в 0D.
1D (Первое измерение):. . .
|
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek
ВВЕДЕНИЕ
Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
|
|
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
|
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2.
Задача:
Обеспечить запись документа в регистр сведений независимо от. . .
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|