LINUX.ORG.RU

Подскажите аллокатор, которому можно задать свой backend

 


0

1

то есть frontend - это malloc,free, вот это всё. backend - это mmap у libcшного ptalloc-ка например. Так вот я хочу иметь аллокатор, который не будет сам ходить за памятью без разрешения, а будет спрашивать меня и я буду лично давать ему шматки из своего пула.

взять тот же ptalloc или иной стандартный as-is не получится, т.к. будет коллизия символов при линковке с непонятными последствиями. да и править его - я пробовал, но мне не хватило терпения и словарного запаса матюков. кроме того, если все объекты в какой-то зоне похерены - я хочу чтоб там не осталось и временных данных аллокатора, а такой фичи у обычных аллокаторов нет.

задача - выделять объекты размера кратного 128 байтам, в основном 128 и 256, очень маловероятно 512-1024 - это буквально временные объекты, которые один хрен пойдут мимо этого аллокатора. realloc не требуется ни при каких условиях.

нужно что-то простое и компактное, но совсем уж простое не поддерживает добавление пулов памяти по необходимости.

взять тот же ptalloc или иной стандартный as-is не получится, т.к. будет коллизия символов при линковке с непонятными последствиями

Что? Вот для того там отдельный backend, чтоб он вдруг не был сменным?

Непонятно, что ты хочешь услышать в ответ кроме «бери попроще и пиши свой».

t184256 ★★★★★
()

Ты хочешь сделать чтобы malloc из libc пользовался твоими колбеками (и, соответственно, всем кто делает malloc раздавал память через них, например функции fopen когда она выделяет память под структуру FILE), или же тебе нужен аллокатор исключительно для использования в своём собственном коде?

Если второе и единственная его задача выделять объекты не больше чем семи кратных друг другу разных размеров - то пиши свой, это будет по всему эффективнее чем тюнить аллокатор общего назначения под эти нужды. Вобщем-то, вся логика такого аллокатора уложится в пару страниц кода (семь цепоченых списков для свободных блоков по 128,256,512,640,768,896,1024 байт, сами блоки выделяются и включаются в эти списки по какому-то простому алгоритму из полученных больших блоков от того что ты называешь бекэндом, функция «взять свободный блок из списка», «вернуть блок в список», ну и особый случай для запроса ещё одного большого блока если с списке свободных пусто)

firkax ★★★★★
()
Ответ на: комментарий от firkax

… то пиши свой, это будет по всему эффективнее чем тюнить аллокатор общего назначения

На github их как тараканов в Нью Йорке …

anonymous
()
Ответ на: комментарий от anonymous

Так потому и много, что свой написать быстрее чем приделывать тюнинг (или костыли) к чужому. А если ты напишешь аллокатор, который умеет сразу все виды аллокаций, которые можно придумать, то придётся тратить слишком много времени на чтение документации к нему перед использованием, и возможно он будет медленнее из-за кучи бранчей везде. Опять выходит - проще за полчаса написать свой узкоспециализированный. Даже более того - может получиться так, что в рамках одной проги эффективнее будет написать два разных аллокатора для разных её кусков, чем один универсальный для обоих.

Вобщем, это не тот случай где надо молиться на переиспользование кода, нестандартный аллокатор это такая одноразовая штука под конкретную задачу. А стандартный уже есть (libc malloc) - если не хочется возиться просто бери его.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

я не хочу использовать malloc. вообще. мне нужен свой аллокатор, хотя бы из чужих исходников. приспособить malloc оказалось не реально, я таких сильных матов не знаю.

salozar
() автор топика
Ответ на: комментарий от anonymous

так всё можно. вопрос был в том, где взять аллокатор а не «можно ли его использовать».

salozar
() автор топика
Ответ на: комментарий от salozar

мне нужен свой аллокатор, хотя бы из чужих исходников.

бери

вопрос был в том, где взять аллокатор

в поисковике. тебе все равно туда ходить, не халявь.

t184256 ★★★★★
()
Ответ на: комментарий от t184256

Казалось бы, при чем тут кресты.

Использую C++ как Си.

В этом есть свои плюсы ...
anonymous
()
Ответ на: комментарий от salozar

я таких сильных матов не знаю.

Мы знаем. Фанера пролетает.

Not_a_Troll
()
Зал суда. Идет бракоразводный процесс. Судья:
— Почему вы хотите развестись со своим мужем?
— А он меня в постели не устраивает!
Женские голоса из зала: — Всех устраивает,а ее не устраивает!
Мужские голоса: — Да ее вообще никто не устраивает!
s-o
()

Не понимаю постановку задачи. Нужен drop-in replacement для libc malloc/free для произвольной программы? Или в коде можно явно вызывать свой аллокатор?

anonymous
()

@salozar, помогу вам не много.

Много ныне «УЧЕНЫЕ МУЖИ» наплодили разного API.
Так какое же использовать?
А просто!

Смотрите какие библиотеки используют популярные и всеми признанные проекты ...
anonymous
()
Ответ на: комментарий от anonymous

ну вот они например opencv используют. мне тоже opencv вместо аллокатора использовать?

salozar
() автор топика
Ответ на: комментарий от anonymous

я свой js-движок пишу. там есть 3 способа аллокации:

1)как malloc но мелкого размера(128*n байт, n <= 8) 2)temporary malloc (очищается одним вызовом) 3)movable malloc(блок данных при проходе gc при меремещении обновляет указатель на себя).

так вот (1) вызвало у меня затруднения. дело в том, что адреса возвращаемые маллоком должны лежать в определенной области. более того, эта область порублена на куски размером 64к, и мне надо знать когда кусок 64к освободился чтоб вернуть его в пул кусков а может быть и освободить через madvise/VirtualAllocEx

salozar
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.