Когда нам нужно использовать posix_memalign вместо malloc?

Кажется, posix_memalign позволяет выбрать настроенный alignment, но когда это необходимо?

malloc уже выполнил внутреннюю работу выравнивания.

UPDATE

Точная причина, по которой я спрашиваю об этом, - это то, что я вижу, что nginx делает это, ngx_memalign(NGX_POOL_ALIGNMENT, size, log);, здесь NGX_POOL_ALIGNMENT определяется как 16, nginxs.googlecode.com/svn-history/trunk/src/core/ngx_palloc.c

Ответы

Ответ 1

В принципе, если вам требуется более жесткое выравнивание, чем даст вам malloc. Malloc обычно возвращает указатель, выровненный таким образом, что его можно использовать с любым из примитивных типов (часто 8 байтов на обычных настольных компьютерах).

Однако иногда вам нужна память, выровненная на других границах, например, выравнивание по 4K и т.д. В этом случае вам понадобится memalign.

Вам понадобится это, например,

  • при записи диспетчера памяти (например, сборщика мусора). В этом случае иногда удобно работать с памятью, выровненной на больших размерах блока. Таким образом, вы можете хранить метаданные, общие для всех объектов в данном блоке в нижней части выделенной области, и обращаться к этому просто путем маскирования наименее значимых бит указателя объекта.
  • при взаимодействии с оборудованием (никогда не делал этого сам, но IIRC, некоторые виды блочных устройств требуют согласованной памяти). См. Пл. ответ для деталей.

Ответ 2

Единственными преимуществами posix_memalign, насколько я могу судить, являются:

  • Выделение памяти с выравниванием по страницам (обычно 4096 или больше) для аппаратных целей.
  • Злые хаки, где вы храните низкие N биты нулевого указателя, чтобы вы могли хранить целое число N -битное в младших битах.: -)

Ответ 3

У различных аппаратных средств могут быть требования к выравниванию, которые malloc не может удовлетворить. На странице руководства Linux приведен один такой пример:

Во многих системах есть выравнивание ограничения, например. на буферах, используемых для прямое блочное устройство ввода/вывода. POSIX определяет pathconf (путь, _PC_REC_XFER_ALIGN) что говорит о необходимости выравнивания.

Ответ 4

Несколько применений:

  • Некоторые процессоры имеют инструкции, которые будут работать только на данных, которые выровнены по мощности, превышающей или равной размеру буфера - например, инструкции по обратному обращению бит, используемые в ffts (быстрые преобразования Фурье).

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

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