Вы используете стандартные распределители, когда они «достаточно хороши» для того, что вам нужно сделать. Разница между программой, которая работает в 10 мс, и той, которая работает в 100 мс, может быть в 10 раз, но на практике это различие не имеет смысла. Оба запускаются «мгновенно».
Это не значит, что вы никогда не должны использовать свою собственную стратегию распределения. В общем, вы должны использовать стратегию распределения, которая соответствует вашему сценарию использования и требованиям. То, что вы описали, очень похоже на пул объектов , который является широко известным и часто используемым шаблоном в ситуациях, когда у вас много объектов одного типа.
Имейте в виду, что стандартные распределители памяти должны поддерживать все возможные варианты использования. Поскольку ваш специализированный распределитель знает о ваших шаблонах использования, вы можете выжать из него чуть больше для вашего конкретного c варианта использования , но вряд ли это будет быстрее, чем Стандартные распределители с жесткой настройкой в целом во всех возможных случаях использования.
В большинстве реализаций стандартных библиотек для new
/ malloc
используется распределитель пула, который является некоторым обобщением пула объектов, который вы используете. реализовал. При первом запросе некоторой памяти они выделяют большой кусок памяти из ОС, а затем раздают фрагменты этого пула по запросу, отслеживая, какие фрагменты используются, а какие доступны для последующего (повторного) использования. Когда пул закончится, они получат еще один кусок памяти из ОС и начнут раздавать его.
Самое большое отличие от того, что вы реализовали, заключается в том, что когда вы выделяете новый пул, вы перемещаете все из старого в новый. В общем случае для больших объемов данных такое копирование, вероятно, станет узким местом, которое преодолеет любую выгоду, которую вы получите от локальности, и если ваши данные больше, чем строка кэша, на самом деле не имеет значения, все ли они смежные или нет.
Ваш подход также требует, чтобы каждый пользователь распределителя был осведомлен о его реализации, поскольку каждое перераспределение аннулирует любые указатели или ссылки на старый пул. Это означает, что вы обменяли простоту обслуживания на производительность. Это может не иметь значения для школьного проекта, на который вы никогда больше не взглянете, но для реальных приложений очень важна постоянная стоимость обслуживания.