Я хотел добавить свои 2 цента только потому, что никто другой не указал, что из вашего описания кажется, что вы реализуете стандартный распределитель кучи (то есть то, что мы все уже используем каждый раз, когда мы вызываем malloc () или оператор new).
Куча - это именно тот объект, который отправляется в диспетчер виртуальной памяти и запрашивает большой кусок памяти (то, что вы называете «пулом»).Тогда у него есть все виды различных алгоритмов для работы с наиболее эффективным способом выделения фрагментов различного размера и их освобождения.Кроме того, многие люди модифицировали и оптимизировали эти алгоритмы на протяжении многих лет.В течение долгого времени Windows поставлялась с опцией под названием куча с низкой фрагментацией (LFH), которую вы должны были включать вручную.Начиная с Vista, LFH по умолчанию используется для всех куч.
Кучи не идеальны, и они могут определенно снизить производительность при неправильном использовании.Поскольку поставщики ОС не могут предвидеть каждый сценарий, в котором вы будете использовать кучу, их менеджеры кучи должны быть оптимизированы для «среднего» использования.Но если у вас есть требование, аналогичное требованиям для обычной кучи (то есть множества объектов, различного размера ....), вам следует рассмотреть возможность использования кучи и не переизобретать ее, так как скорее всего ваша реализация будет хуже, чем ОСуже обеспечивает вас.
При выделении памяти единственный раз, когда вы можете повысить производительность, не просто используя кучу, это отказаться от какого-то другого аспекта (издержки выделения, время жизни выделения ....), что не важнок вашему конкретному приложению.
Например, в нашем приложении у нас было требование для многих выделений менее 1 КБ, но эти выделения использовались только в течение очень коротких периодов времени (миллисекунд).Чтобы оптимизировать приложение, я использовал библиотеку Boost Pool, но расширил ее так, чтобы мой «распределитель» фактически содержал коллекцию объектов Boost Pool, каждый из которых отвечал за выделение одного определенного размера от 16 байтов до 1024 (с шагом 4).Это обеспечило почти бесплатное (O (1) сложность) выделение / освобождение этих объектов, но выгода в том, что а) использование памяти всегда велико и никогда не снижается, даже если у нас не выделен ни один объект, б) никогда не увеличивать пулосвобождает память, которую он использует (по крайней мере, в том режиме, в котором мы его используем), поэтому мы используем его только для объектов, которые не задерживаются слишком долго.
Итак, какие аспекты нормального распределения памятиВы готовы отказаться от своего приложения?