POSIX_MEMALIGN(3)

НАЗВАНИЕ
posix_memalign, memalign, valloc - распределение выровненной памяти

СИНТАКСИС
#include <stdlib.h>

int posix_memalign(void **memptr, size_t alignment, size_t size);
void *memalign(size_t boundary, size_t size);
void *valloc(size_t size);

ОПИСАНИЕ
Функция posix_memalign() распределяет size байтов и помещает адрес распределенной памяти в *memptr. Адрес распеределенной памяти будет кратен alignment, который должен быть степенью числа 2 и быть кратным sizeof(void *). Устаревшая функция memalign() размещает size байтов и возвращает указатель на распределенную память. Адрес памяти будет кратен boundary, который должен быть степенью числа 2. Устаревшая функция valloc() размещает size байтов и возвращает указатель на распределенную память. Адрес памяти будет кратен размеру страницы. Эквивалентно memalign(sysconf(_SC_PAGESIZE),size). Для всех этих трех процедур мамять не будет заполнена нулями.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
memalign() и valloc() возвращают указатель на размещенную память, или NULL если запрос выдал ошибку. posix_memalign() возвращает ноль при нормальном завершении работы или, при ошибке, одно из значений, перечисленных в следующем разделе. Заметим, что errno при этом не определяется.

НАЙДЕННЫЕ ОШИБКИ

EINVAL
    Параметр alignment не равен степени числа 2 или не кратен sizeof(void *).

ENOMEM
    Недостаточно памяти для выполнения запроса на размещение.

ЗАМЕЧАНИЯ
posix_memalign() проверяет, чтобы alignment соответствовало всем требованиям, указанным выше. memalign() может не проверять корректность параметра boundary. POSIX требует, чтобы память, полученная от posix_memalign() была высвобождена через free(). Некоторые системы не обеспечивают метода исправления памяти, выделенной с помощью memalign() или valloc() (так как можно передать free() указатель, полученный из malloc(), в то время как memalign() будет вызывать malloc() и только затем выравнивать полученное значение). GNU libc позвволяет памяти, полученной через любую из этих процедур, быть исправленной с помощью free(). malloc() для GNU libc всегда возвращает 8-байтовый выровненный адрес памяти, так что эти процедуры требуются только если вам нужны большие выровненные значения.

ДОСТУПНОСТЬ
Функции memalign() и valloc() доступны в Linux во всех библиотеках libc. Функция posix_memalign() доступна, начиная с glibc 2.1.91.

СООТВЕТСТВИЕ СТАНДАРТАМ
Функция valloc() появилась в 3.0 BSD. Она указана, как устаревшая, в BSD 4.3, и как стандартная, в SUSv2. Этого уже нет в SUSv3. Функция memalign() появиляется в SunOS 4.1.3 но не в BSD 4.4. Функция posix_memalign() пришла из POSIX 1003.1d.

СМ. ТАКЖЕ
malloc(3), free(3), getpagesize(2), brk(2)