Перераспределить память, чтобы избежать фрагментации памяти

Вот простой пример, чтобы объяснить проблему (с C++):

A* a1 = new A;
A* a2 = new A;
A* a3 = new A;
delete(a2);
B* b = new B;
.
.
.

скажем, размер A объект равен 3, а размер B объект равен 4, а размер моей кучи равен 12, после удаления a2 память будет выглядеть так:

XXX --- XXX ---

Я не могу создать объект B* b даже если памяти достаточно, так как она не смежна.

Просто простой пример фрагментации памяти.

Могу ли я избежать этого динамически, создав какой-то reallocate() функция, функция, которая "перемещает" память объекта a3 и положить его сразу после:

XXXXXX ------

Функция должна вызываться после удаления a2так что может быть переопределить deallocate() или же delete() можно сделать это, как я могу сделать это, пожалуйста?

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

1 ответ

Распределение памяти действительно часто является узким местом. Но написать свой собственный распределитель не легко. Есть несколько способов сделать это неправильно.

В вашем случае это выглядит так, как будто какой-то распределитель плит будет соответствовать вашим потребностям.

Но вместо того, чтобы писать свой собственный, вы можете использовать закаленную в боях реализацию, такую ​​как jemalloc. Facebook использует его с C и C++ и даже вносит исправления. Смотрите этот пост в Facebook.

Вопрос о том, как интегрировать jemalloc с C++, решается здесь.

PS: я не цитирую Facebook, потому что это ажиотаж, а потому что это хорошо известная компания с реальными проблемами производительности. Google также использует собственный распределитель: tcmalloc

Другие вопросы по тегам