Книга: Linux программирование в примерах
14.1. Выделение выровненной памяти: posix_memalign() и memalign()
14.1. Выделение выровненной памяти: posix_memalign()
и memalign()
Для большинства задач отлично подходят стандартные процедуры выделения памяти — malloc()
, realloc()
и т.д. Но иногда может понадобиться память, которая выровнена тем или иным способом. Другими словами, адрес первого выделенного байта является кратным какого-нибудь числа. (Например, на некоторых системах копирование памяти осуществляется значительно быстрее, если используются буфера, выровненные по границе слова.) Такую службу предоставляют две функции:
#include <stdlib.h>
является более новой функцией; она является частью другого необязательного расширения, «Консультативной информации» («Advisory Information»). Работа функции отличается от других функций выделения памяти Linux. При наличии проблемы она не возвращает -1. Вместо этого возвращаемое значение равно 0 при успехе или значению
int posix_memalign(void **memptr, size_t alignment, size_t size);
/* POSIX ADV */
void *memalign(size_t boundary, size_t size); /* Обычная */
posix_memalign()errno
в случае неудачи. Аргументы следующие:
void **memptr
Указатель на переменную void*
. Указываемая переменная будет содержать адрес выделенного блока памяти. Выделенная память освобождается с помощью free()
.
size_t alignment
Требуемое выравнивание. Оно должно быть кратно sizeof(void*)
и быть степенью двойки.
size_t size
Число выделяемых байтов.
memalign()
является нестандартной, но широко доступной функцией, которая работает сходным образом. Возвращаемое значение равно NULL
в случае неудачи и запрошенному блоку памяти при успехе, причем boundary
(степень двойки) обозначает выравнивание, a size
— затребованный размер памяти.
Традиционно выделенная memalign()
память не могла быть освобождена с помощью free()
, поскольку memalign()
использовала для выделения памяти malloc()
и возвращала указатель на выровненный подходящим образом байт где-то внутри блока. Версия GLIBC не имеет этой проблемы. Из этих двух функций следует использовать posix_memalign()
, если она у вас есть.
- 3.2. Выделение памяти
- Выделение памяти
- 3.2.1.2. Начальное выделение памяти: malloc()
- Неисправности оперативной памяти
- Как работает модуль оперативной памяти
- Описание типов модулей оперативной памяти
- Извлечение и установка модулей памяти
- Характеристики модулей памяти
- ПО для диагностики оперативной памяти
- Поиск и устранение неисправностей модулей памяти
- 2.3.6. Задание объектов физической памяти
- Как узнать, какая у меня видеокарта, процессор и сколько памяти?