|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||||||||||||
Свой Allocator04.12.2024, 17:38. Показов 1294. Ответов 8
Метки нет (Все метки)
Здравствуйте! Пожалуй, подниму тему allocator-ов ещё раз, опять же упражнение из книги Страуструпа в котором он предлагает реализовать свой аллокатор. В главе он приводит пример pool-allocator-а, но с ограничение, он выделяет память только для одного элемента, в упражнении же предлагается создать или расширить тот аллокатор, который автор реализовал, для выделения блоков памяти для нескольких значений. И..., что для этого нужно делать, моё предположение, исходя из того что функция grow() создаёт новый кусок и размечает его в цикле для каждого следующего элемента, то в случае выделения блока под n-элементов нужно изменять grow() что бы начало(head) указывала на начало блока, а поле next указывало на окончание данного блока. Хотя, как тогда будет конструироваться объект, по какому адресу?! Собственно это то что я хотел бы узнать на первом этапе.
Pool
Pool_alloc
0
|
||||||||||||
| 04.12.2024, 17:38 | |
|
Ответы с готовыми решениями:
8
Как сделать свой контейнер совместимым с std::allocator? Распределитель памяти идентичный std::allocator. Непонятные синтаксис и концепция std::allocator::construct
|
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 04.12.2024, 20:48 | |
|
вам потрениоваться (поиграться) или сделать нормальный аллокатор которым пользоваться можно?
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||
| 04.12.2024, 23:59 [ТС] | ||
|
Добавлено через 52 минуты Видимо, тут нужно ещё предусмотреть некий флаг сообщающий "менеджеру памяти", используется ли это участок или нет. Например, в структуру Link добавить флаг isUse. Но как различит, что данная ячейка не принадлежит некоему диапазону адресов, что я имею ввиду, допустим я зарезервировал память для vector из этой зарезервированной памяти я использую лишь часть ячеек, соответственно, у остальных флаг isUse == false и вот какой-то контейнер пытается выделить память для себя, его аллокатор обращается к адресам, которые уже зарезервированы для vector, но ещё не используются, что делать, как подобного избежать. Опять же, ещё одна проблема, а что если я выделил диапазон для контейнера, и конструируя элементы выхожу за границу этого диапазона, нужно ли кидать исключение? И как хранить и, самое главное где, границы этого диапазона. При resize() может быть фрагментация это тоже нужно учитывать..., пока что море вопросов. Тогда в класс Pool нужно будет внести изменение, добавить функцию alloc(size_t n); тогда нужно добавить free(void* p, size_t n); для симметрии.
0
|
||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 05.12.2024, 00:35 | |
|
тогда надо начать с понимания. Когда нужен свой аллокатор.
Когда у вас есть особые требования к эксплуатации этого аллокатора, которые обычными аллокаторами входящими в состав стандартной библиотеки не решаются. Например: 1)Скорость работы. Вы пишете сетевой стек сервера многопользовательской игры. вам надо каждому игроку посылать и принимать udp пакеты. размер до 1492 байт (с учётом что часть пользователей может сидеть через pppoe или чего аналогичного). Вам приходится посылать и принимать тысячи таких пакетов в секунду, что-то из этого запоминать и некоторое врмя хранить. Вам надо это делать очень быстро. На помошь приходит pool-allocator. Размер блока фиксированный, а скорость работы - максимальная. Стандарнтый аллокатор не такой быстрый. попробуйте в рандомном порядке делать malloc|free для 20000 блоков в секунду, когда не менее 10000 из них выделено. 2)Работа с внешней памятью. Когда у вас метаданные о выделенных блоках хранятся отдельно от самих блоков, а область памяти внутри которой надо работать заранее определена. Типичный пример - выделение памяти видеоадаптера под модели и текстуры. Стандартный аллокатор такого в принципе не умеет. 3)особые требования по обслуживанию. например как talloc. 4)Требования по выравниванию. возвращаемый участок памяти должен быть выровнян хотябы по 16 байт. иначе при включенной оптимизации будете вываливаться в ОС на каждой SSE инструкции ))) Вот от этих требований и надо отталкиваться. У вас сейчас каша. pool allocator - как раз специально сделан чтобы максимально быстро "жонглировать" блоками одинакового размера, и не надо из него франкенштейна делать. Если хотите поиграться - то освойте аллокаторы по порядку. https://habr.com/ru/articles/505632/ Научитесь их использовать - для чего каждый нужен и паттерны применения. и надо сразу понимать - в 99% случаев свои аллокаторы бесполезны ))
1
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
|||||||||||||
| 05.12.2024, 17:12 [ТС] | |||||||||||||
|
Почитав про pool-allocator-ы я решил, что нужно подправить класс pool, возможно, что опять мимо, но всё же... Если требуется выделить память для одного элемента, то всё остаётся как прежде, если же требуется выделить память для нескольких элементов(возможно, терминология не верна), то нужно применить следующую функцию alloc и free: Я их не проверял в работе т.к. это всего лишь идея, с большой вероятностью, неудачная. alloc(size_t n)
free(void*, size_t)
0
|
|||||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||||||
| 07.12.2024, 16:00 [ТС] | ||||||
|
Кликните здесь для просмотра всего текста
0
|
||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||||||
| 08.12.2024, 17:42 [ТС] | ||||||
|
Linear_alloc
Кликните здесь для просмотра всего текста
0
|
||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,631
|
||||||
| 09.12.2024, 14:35 [ТС] | ||||||
|
Stack_alloc
Кликните здесь для просмотра всего текста
0
|
||||||
|
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 866
|
|
| 09.12.2024, 16:12 | |
|
а теперь расскажите как вы их будете применять - с примерами.
ибо это самое интересное.
0
|
|
| 09.12.2024, 16:12 | |
|
Помогаю со студенческими работами здесь
9
std::allocator std::allocator
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
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 Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|