Загадка

Я думаю, что это не было подчеркнуто каким-либо ответом, но еще один хороший пример и использование для нового места размещения - это сокращение фрагментации памяти (с помощью пулов памяти). Это особенно полезно для встроенных и высокодоступных систем. В этом последнем случае это особенно важно, потому что для системы, которая должна работать 24/365 дней, очень важно не иметь фрагментации. Эта проблема не имеет ничего общего с утечкой памяти.

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

Таким образом, после запуска вашего приложения у вас уже есть вся необходимая память. Все новые резервирования / освобождения памяти относятся к выделенным пулам (у вас может быть несколько пулов, по одному для каждого класса объектов). В этом случае не происходит фрагментации памяти, так как не будет пробелов, и ваша система может работать в течение очень длительных периодов (лет) без фрагментации.

Я видел это на практике специально для VoxWorks RTOS, поскольку его система распределения памяти по умолчанию сильно страдает от фрагментации. Поэтому выделение памяти с помощью стандартного метода new / malloc было в основном запрещено в проекте. Все резервирования памяти должны поступать в выделенный пул памяти.

1
задан kencorbin 5 March 2019 в 17:50
поделиться