По моему опыту, вариант 2 намного проще работать с минимальными накладными расходами. Realloc не гарантирует , что увеличит размер существующей памяти. И на практике это почти никогда не происходит. Если вы используете его, вам нужно будет вернуться и переназначить все старые объекты. Это потребовало бы, чтобы вы помнили, где находился каждый выделенный объект ... Это может быть огромной накладной.
Но трудно определить «самый эффективный», не зная точно, какие метрики вы используете.
Это менеджер памяти, который я всегда использую. Он работает для всего приложения, а не только для одного объекта.
ALLOCS:
для каждого выделения определяют размер выделенного объекта.
1 посмотрите на список ссылок для освобождения объектов такого размера, чтобы увидеть, было ли что-нибудь освобождено, если так, возьмите первое бесплатное
2 искать в справочной таблице и, если не найден
2.1 выделяет массив из N объектов такого размера.
3 возвращает следующий свободный объект нужного размера.
3.1, если массив заполнен, добавить новую страницу.
N объектов могут быть настроены программистом. Если вы знаете, что у вас есть миллион 16-байтовых объектов, вы можете захотеть, чтобы N было немного выше.
для объектов более некоторого размера X, не храните массив, просто выделяйте новый объект.
освобождает:
определить размер объекта, добавить его в список ссылок для освобождения.
, если размер выделенного объекта меньше размера указателя, список ссылок не должен вызывать никаких накладных расходов памяти. просто используйте уже выделенную память для хранения узлов.
Проблема этого метода заключается в том, что память никогда не возвращается в операционную систему, пока приложение не завершится или программист не решит выполнить дефрагментацию памяти. дефрагментация это еще один пост. это может быть сделано.