-2

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

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

+0

Позвольте вашей ОС заботиться о фрагментации памяти. Не пытайтесь, а потом догадывайтесь об этом. Если вы действительно хотите что-то сделать, создайте std :: vector и используйте это. Вы можете использовать другой вектор int для хранения индексов «удаленных» объектов. – Robinson

+0

Это просто простой пример: я на самом деле работаю над очень большим проектом. –

+0

Сначала вам нужно доказать, что фрагментация является проблемой для вашего программного обеспечения. Как только вы это сделаете, если вам не нравится стратегия распределения/перераспределения ОС, вы можете сделать свой собственный. Я бы не стал пытаться взломать диспетчер памяти OS для вашего проекта. – Robinson

ответ

1

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

В вашем случае это похоже на какой-то slab allocator, соответствующий вашим потребностям.

Но вместо того, чтобы писать свои собственные, вы можете полагаться на завершенную в битве реализацию, такую ​​как jemalloc. Facebook использует его с C и C++ и даже предоставляет исправления. См. Это facebook engineering blog post.

Вопрос как интегрировать jemalloc с C++ обрабатывается here

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

+0

Спасибо за ваш ответ, знаете ли вы какой-либо учебник для написания моего собственного распределителя? Это исследовательский проект, поэтому мне, возможно, придется написать собственный распределитель –

Смежные вопросы