Барыш:
Ваш вопрос очень общий, но вот мой ответ / руководство:
Я не знаю об игровых движках, но для встроенных приложений и приложений реального времени. Основные цели алгоритма распределения:
1- Ограниченное время выполнения: вам нужно заранее знать время распределения в худшем случае, чтобы вы могли соответствующим образом планировать свои задачи в реальном времени.
2- Быстрое выполнение: чем быстрее, тем лучше, очевидно
3- Всегда выделять: особенно для приложений, критичных для безопасности в режиме реального времени, все запросы должны быть удовлетворены. Если вы запрашиваете место в памяти и получаете нулевой указатель: проблема!
4- Уменьшение фрагментации. Хотя это зависит от используемого алгоритма, обычно менее фрагментированные выделения обеспечивают лучшую производительность по ряду причин, включая эффекты кэширования.
В большинстве критических систем вам не разрешается динамически выделять память для начала. Вы анализируете свои требования и определяете максимальное использование памяти и выделяете большой кусок памяти, как только ваше приложение запускается. Если вы не можете, то приложение даже не запускается, если оно запускается, новые блоки памяти не выделяются во время выполнения.
Если скорость имеет значение, я бы рекомендовал придерживаться аналогичного подхода. Вы можете реализовать пул памяти, который управляет вашей памятью. Пул может инициализировать «достаточный» блок памяти при запуске вашего приложения и обслуживать ваши запросы памяти из этого блока. Если вам требуется больше памяти, пул может выполнить другое, вероятно, большое выделение (в ожидании большего количества запросов памяти), и ваше приложение может начать использовать эту вновь выделенную память. Также существуют различные схемы объединения памяти, и управление этими пулами - еще одна тема.
Как и в некоторых примерах: ОСРВ VxWorks использовала алгоритм распределения по первому размеру, где алгоритм анализировал связанный список, чтобы найти достаточно большой свободный блок. В VxWorks 6 они используют алгоритм наилучшего соответствия, в котором свободное место хранится в дереве, а выделения пересекают дерево для достаточно большого свободного блока. Есть белая бумага под названием Memory Allocation in VxWorks 6.0
, написанная Золтаном Ласло, которую вы можете найти в Google, которая содержит более подробную информацию.
Возвращаясь к вашему вопросу о скорости / фрагментации: это действительно зависит от вашего приложения. Что нужно учитывать:
Собираетесь ли вы делать много очень небольших или относительно больших ассигнований?
Будут ли ассигнования распределяться пакетами или распределяться равномерно по приложению?
Каков срок службы распределений?
Если вы задаете этот вопрос, потому что собираетесь реализовать свой собственный распределитель, вам, вероятно, следует разработать его таким образом, чтобы вы могли изменить базовый алгоритм выделения / освобождения, потому что если скорость / фрагментация действительно такова критично для вашего приложения, вы захотите поэкспериментировать с различными распределителями. Если бы я рекомендовал что-то, не зная ни одного из ваших требований, я бы начал с TLSF, поскольку он обладает хорошими общими характеристиками.