|
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 27
|
|
Как написать код выделения памяти20.01.2024, 20:49. Показов 1986. Ответов 12
Подскажите пожалуйста, как написать код, который маллочит несколько мегабайт памяти, а потом выдает небольшие кусочки, чтобы не делать на каждое выделение системный вызов?
В частности интересует несколько вопросов: 1. В какую структуру данных запоминать выделенные участки? (Очевидно, что она не должна требовать выделения на каждое добавление, т.к. в таком случае она просто не имеет смысла) 2. Как производить поиск уже выделенных участков? (Очевидно, хочется что-то быстрее O(n)) 3. Как осуществлять "дефрагментирование" по возможности? (Т.е. выделили первый, второй и третий участки. Второй освободили. Следующее выделение по возможности должно занять место второго участка.)
0
|
|
| 20.01.2024, 20:49 | |
|
Ответы с готовыми решениями:
12
Написать код программы, используя функции динамического выделения памяти Написать код для динамического выделения памяти под массив из 10000 целых чисел Как написать функцию выделения памяти? |
|
Злостный нарушитель
10349 / 5767 / 1271
Регистрация: 12.03.2015
Сообщений: 26,637
|
||
| 20.01.2024, 21:28 | ||
|
Думаешь, что так быстрее будет? (спойлер: нет). Функции работы с памятью - это функции ядра ОС. Они оптимизированы до совершенства и быстрее ты ничего не придумаешь. --------- А если ты написал код, который занимается перераспределением памяти 100500 раз в секунду, то это ты ССЗБ.
0
|
||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
||||||
| 20.01.2024, 23:56 | ||||||
|
А вообще - ТС - напиши что тебе надо а не отдельные вопросы которые кусочками затрагивают сложную тему. какой тип аллокатора надо? стратегия его использования? чем не устраивает malloc при вашей стратегии использования ? - вот тут особо надо постараться с точностью формулировок.
0
|
||||||
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
||
| 21.01.2024, 06:57 | ||
|
~1000-1500 тактов - довольно тяжелая операция 2. - Это, как довольно точно выразился Aledveu, т.н. "аллокаторы общего назначения", они неспособны часто выделять маленькие объемы памяти. 3. - Довольно общий, и может быть, неточный пример, зачем тогда в Intel TBB несколько своих аллокаторов?
0
|
||
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
|
| 21.01.2024, 07:10 | |
|
zx_gamer, если участки имеют одинаковый размер, то вы описали идиому Pool Allocator.
Смысл в чем: храниться список адресов свободных участков памяти. При выделении памяти просто берем оттуда адрес (O(1)), при освобождении памяти кладем адрес туда обратно (O(1)). Конструктор, выполняющий изначальную инициализацию списка свободными адресами работает за O(n).
0
|
|
|
фрилансер
6461 / 5663 / 1130
Регистрация: 11.10.2019
Сообщений: 15,079
|
|
| 21.01.2024, 07:13 | |
|
zx_gamer, глянь вот это Полиморфные аллокаторы
1
|
|
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
|
| 21.01.2024, 07:27 | |
|
zx_gamer, согласен с Aledveu, нужны конкретные сценарии использования аллокатора.
Например, пусть вы пишете игровой движок и вам надо быстро выделять, скажем, дескрипторы объектов движка (если у вас движок, например, на базе ECS, то это числовые идентификаторы), то они зачастую, одинакового размера и идиома Pool Allocator, на мой взгляд, наиболее предпочтительна. Добавлено через 7 минут Алексей1153, интересная штука, когда 2 года назад этим интересовался, не знал, что стандартная библиотека уже предлагает свою реализацию чего-то типа прослойки для контейнеров. Но по-моему лучше уметь реализовывать свои STL аллокаторы, ибо виртуальные функции не всегда приемлемы, да и 17 стандарт все еще не повсеместен .
0
|
|
|
фрилансер
6461 / 5663 / 1130
Регистрация: 11.10.2019
Сообщений: 15,079
|
|||
| 21.01.2024, 07:43 | |||
)Добавлено через 3 минуты
0
|
|||
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
||
| 21.01.2024, 09:01 | ||
|
Алексей1153, я про некоторые embedded платформы.
Добавлено через 4 минуты -fno-rtti может быть просто захардкоден в проприетарном компиляторе.
0
|
||
|
0 / 0 / 0
Регистрация: 07.04.2020
Сообщений: 27
|
||
| 21.01.2024, 10:34 [ТС] | ||
|
Aledveu, ну например у меня есть шаблонные классы списка, дерева (ключ -- значение) и т.п.
Если там хранится структура весом 50 байт, то не хочется ради каждого добавления в АТД дергать malloc. Кажется, что получить пару мегабайт разом, а потом просто распределять их будет гораздо быстрее, чем каждый раз дергать malloc. Добавлено через 7 минут Если честно, мне больше нравится идея перегрузить operator new и operator delete, потому что использование аллокаторов вынуждает писать operator== и т.п. шаблонными, что сильно раздует конечный бинарник (каждый с каждым будет реализован заново). И соответственно выбирать политику аллокации в рантайнме. Условно, если void* operator new(size_t n) получил n, большее мегабайта (1048576), то просто malloc, если меньше или равно, то по описанному выше сценарию. Добавлено через 14 минут
0
|
||
|
фрилансер
6461 / 5663 / 1130
Регистрация: 11.10.2019
Сообщений: 15,079
|
||
| 21.01.2024, 11:57 | ||
|
насчёт проще - это нет. Язык всё время упрощается. 98 - сложный, 17 - намного проще
0
|
||
|
168 / 146 / 32
Регистрация: 03.09.2018
Сообщений: 499
|
|
| 21.01.2024, 12:28 | |
|
Память, это тоже самое что и char*array; Вы можете зарезервировать максимальное количество, либо заполнять постепенно, выделяя каждый раз ровные участки по 16-32-65-128. В производительности выделения вы не потеряете, но и не будете тем самым жадным человеком, который забрал все игрушки себе, а играется со своим носом).
0
|
|
|
27 / 24 / 4
Регистрация: 20.11.2023
Сообщений: 131
|
||||
| 21.01.2024, 15:09 | ||||
|
Добавлено через 9 минут
0
|
||||
| 21.01.2024, 15:09 | |
|
Помогаю со студенческими работами здесь
13
Как написать конструктор для выделения памяти для переменных в классе?
Написать инструкцию выделения памяти для одного экземпляра заданного класса (динамическая память) Как вызвать конструкторы во время выделения памяти (new ) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|