Посоветуйте функцию для с++ для ОС Windows7 которая может просить память из кучи она должна быть ниже new или maloc24.10.2020, 22:12. Показов 5587. Ответов 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 | |
|
Напишите функцию, которая выделяет память для двумерной матрицы из целых чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Nekobox - outbounds[0].transport: unknown transport type: raw
damix 01.10.2026
Фикс ошибки
Правым кликом по серверу -> отладочная информация -> edit
Заменить "net": "raw", на "net": "tcp",
Нажать кнопку reload.
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|