Посоветуйте функцию для с++ для ОС Windows7 которая может просить память из кучи она должна быть ниже new или maloc24.10.2020, 22:12. Показов 5518. Ответов 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 | |
|
Напишите функцию, которая выделяет память для двумерной матрицы из целых чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется.
Ну как вам?
|
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания
источниках данных и элементов формы(текстовые поля и метки), опирается все
это на технологию событий и мета. . .
|
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml,
в чате форсили функторы модулей как суперфичу.
Пытаясь отдуплить концепт, наткнулся на тутор с простым примером.
А главный принцип обучения от. . .
|
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
|
|
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
|
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства.
Жизнь действительно предъявляет каждому. . .
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|