Перераспределить память, чтобы избежать фрагментации памяти
Вот простой пример, чтобы объяснить проблему (с 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