Я работаю над пулом памяти для небольшого игрового движка.
Основное использование будет в качестве отдельного хранилища; пул содержит объект определенного типа и размера. В настоящее время пулы могут использоваться для хранения чего угодно, но распределение будет осуществляться в блоках определенного размера. Большая часть памяти будет выделена сразу, но при необходимости можно включить «разрастание», чтобы помочь в настройке (почти фиксированный размер).
Проблема в том, что я стал немного параноиком, размышляя о выравнивании памяти. Я привык только к необработанному управлению памятью на 8-битных процессорах, где все выровнено по байту.
Я разрешаю пользователю (мне) указать желаемый размер блоков, который в отдельном случае хранения будет размером объектов, которые я собираюсь в нем хранить.
Текущий подход состоит в том, чтобы выделить кусок памяти blocks * (desired_size + header_size)
большой и поместить в него объекты с заголовком для каждого блока; объекты, очевидно, будут расположены непосредственно за этим заголовком.
Что мне нужно учитывать в отношении выравнивания памяти в моем сценарии?
Ответ, который я до сих пор придумал, заключается в том, что, пока desired_size
представляет n -байтно выровненные данные; заголовок правильно выровнен и упакован компилятором, а также фактическими данными, все, что хранится в блоке, будет выровнено n .
n - это любая граница, требуемая платформой. На данный момент я нацеливаюсь на x86, но я не люблю делать предположения о платформе в моем коде.
Некоторые из ресурсов, которые я использовал:
Редактировать
Загружен небольшой пример кода, который может пригодиться кому-нибудь так же смущенному, как и мне, в будущем здесь .