Пул ресурсов для структуры данных


При реализации элементарной структуры данных типа stack, queues, linked list и др. должен ли я создавать пул ресурсов (узлов), динамически выделяя память в связке, или я должен выделять память отдельно каждый раз, когда мне нужен узел?

2 3

2 ответа:

Это целиком зависит от ваших целей. По умолчанию (то есть, если вам действительно не нужно делать иначе), просто выполните нормальное распределение для каждого следующего узла.

Пулы памяти по сравнению с простым выделением узлов:

  • Сделайте распределение быстрее. В зависимости от базового механизма распределения, иногда значительно быстрее.

  • Обычно меньше фрагментации памяти,хотя это не может быть проблемой с некоторыми распределителями.

  • Главный недостаток: тратить память на зарезервированные, но не используемые узлы. Это очень важно, если вы используете структуру данных без разбора (например, 1000 экземпляров), а не просто несколько экземпляров.

Из-за этого недостатка пулы памяти не подходят для общих ситуаций.

В C++ все стандартные контейнеры имеют параметр шаблона allocator.

Это основной компромисс между временем и пространством. Выбирал исходя из того, что для вас важнее:

Если вы выделяете пул заранее,то ваши вставки элементов среды выполнения будут-в среднем-оптимизированы для скорости, т. е. постоянного времени, т. е. "В среднем" означает, что Большинство вставок будет постоянным временем, за исключением тех, которые достигают максимума и требуют расширения пула, которые являются линейным временем, O(n). Вы также рискуете потерять часть памяти, если в конечном итоге не используете целый бассейн.

Если вы делаете выделение в реальном времени каждого нового узла, вы всегда будете иметь вставку с постоянным временем, но в этом случае постоянное время немного больше, чем постоянное время выше, потому что вы не только должны поместить значение в ячейку памяти, но вы также должны сначала выделить ячейку памяти. Кроме того, этот метод не тратит впустую память, резервируя места памяти заранее.

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