Вы задали несколько вопросов здесь ...
Вместо того, чтобы удалить память, какие выгоды бы мы приобретаем на основе повторного использования объектов?
Это полностью зависит от вашего приложения. Даже если предположить, что я знаю, что такое приложение, вы оставили еще одну деталь неопределенной - какова стратегия повторного использования? Но даже зная, что очень сложно предсказать или ответить в целом. Попробуйте кое-что и измерить их.
Как правило, я хотел бы свести к минимуму наиболее безвозмездное распределение. Однако это преждевременная оптимизация. Это только изменило бы тысячи звонков.
Что нового?
Полностью зависит от реализации. Но общая стратегия, которую используют распределители, состоит в том, чтобы иметь свободный список, то есть список блоков, которые были освобождены в процессе. Когда свободный список пуст или содержит недостаточно непрерывное свободное пространство, он должен запросить ядро для памяти, которое он может выдавать только в блоках с постоянным размером страницы. (4096 на x86.) Распределитель также должен решить, когда нужно нарезать, проложить или объединить блоки. Многопоточность также может оказывать давление на распределителей, поскольку они должны синхронизировать их свободные списки.
Как правило, это довольно дорогостоящая операция. Возможно, не столько по отношению к тому, что еще вы делаете. Но это не дешево.
Возникает ли переключатель контекста?
Полностью возможно. Возможно также, что этого не произойдет. Ваша ОС может свободно переключаться на контекст в любое время, когда получает прерывание или сбой, поэтому ...Это может произойти во много раз; Я не вижу особых отношений между этим и вашим распределителем.
Выделяется новая память, кто выполняет выделение? ОПЕРАЦИОННЫЕ СИСТЕМЫ ?
Это может происходить из бесплатного списка, и в этом случае нет системного вызова, следовательно, никакой помощи от ОС. Но это может произойти из ОС, если бесплатный список не может удовлетворить запрос. Кроме того, даже если это исходит из бесплатного списка, ваше ядро могло бы выгрузить эти данные, чтобы вы могли получить доступ к странице при доступе, и распределитель ядра взорвался. Поэтому я предполагаю, что это будет смешанная сумка. Конечно, вы можете иметь соответствующую реализацию, которая делает все виды сумасшедших вещей.
Использование другого распределителя, отличного от стандартного, должно основываться на результатах профилирования или на основе дизайна (например, пула памяти). Помимо этого, распределители, которые поставляются с реализациями, в большинстве случаев прекрасны. – AraK
Хороший вопрос. У меня был один случай, когда после профилирования я переключился на распределитель пула для многих объектов малого и постоянного размера. Я думаю, что контекстный переключатель возникает только для выделения нескольких страниц одновременно (с помощью mmap on linux), и эти страницы повторно используются локатором. Теперь существуют разные стратегии распределения, если вы заранее знаете, что объекты, которые вы выделяете, будут иметь одинаковый размер. Стандартные библиотеки-распределители настроены для общего случая, а не для конкретных. Я слышал, что некоторые распределители поддерживают несколько пулов памяти для малых, средних и больших объектов. –