aligned_alloc
|
Определено в заголовочном файле
<stdlib.h>
|
||
| (начиная с C11) | ||
Выделяет size байт неинициализированной памяти, выравнивание которой задаётся параметром alignment . Параметр size должен быть целым кратным значения alignment .
aligned_alloc
является потокобезопасной: она ведет себя так, как если бы обращалась только к областям памяти, видимым через свои аргументы, и не затрагивала никакое статическое хранилище.
Предыдущий вызов
free
,
free_sized
, и
free_aligned_sized
(since C23)
или
realloc
, который освобождает область памяти,
синхронизируется-с
вызовом
aligned_alloc
, который выделяет ту же самую или часть той же области памяти. Эта синхронизация происходит после любого доступа к памяти функцией освобождения и до любого доступа к памяти функцией
aligned_alloc
. Существует единый полный порядок всех функций выделения и освобождения памяти, работающих с каждой конкретной областью памяти.
Содержание |
Параметры
| alignment | - | задает выравнивание. Должно быть допустимым выравниванием, поддерживаемым реализацией. |
| size | - | количество байт для выделения. Целое кратное alignment |
Возвращаемое значение
При успешном выполнении возвращает указатель на начало вновь выделенной памяти. Чтобы избежать утечки памяти, возвращённый указатель должен быть освобождён с помощью free или realloc .
При неудаче возвращает нулевой указатель.
Примечания
Передача size , который не является целым кратным alignment , или alignment , который не является допустимым или не поддерживается реализацией, приводит к сбою функции и возврату нулевого указателя (в C11, как опубликовано, в этом случае было указано неопределенное поведение, что было исправлено DR460 ). Было предложено удаление ограничений размера, чтобы сделать возможным выделение небольших объектов с ограничительными границами выравнивания (аналогично alignas ) в документе N2072 .
В качестве примера требования «поддерживается реализацией», функция POSIX
posix_memalign
принимает любое
alignment
, которое является степенью двойки и кратным
sizeof
(
void
*
)
, и POSIX-совместимые реализации
aligned_alloc
наследуют эти требования.
Фундаментальные выравнивания всегда поддерживаются. Если
alignment
является степенью двойки и не превышает
_Alignof
(
max_align_t
)
,
aligned_alloc
может просто вызывать
malloc
.
Обычный
malloc
выравнивает память, подходящую для любого типа объектов с фундаментальным выравниванием. Функция
aligned_alloc
полезна для сверхвыровненных выделений памяти, таких как выравнивание по границе
SSE
, линии кэша или
страницы виртуальной памяти
.
Эта функция не поддерживается в библиотеке Microsoft C Runtime, поскольку её реализация
std::free
не способна обрабатывать выровненные выделения памяти
любого вида. Вместо этого MS CRT предоставляет
_aligned_malloc
(который должен освобождаться с помощью
_aligned_free
).
Пример
Возможный вывод:
default-aligned addr: 0x1e40c20 1024-byte aligned addr: 0x1e41000
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.22.3.1 Функция aligned_alloc (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.22.3.1 Функция aligned_alloc (стр: 253)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.22.3.1 Функция aligned_alloc (стр. 347-348)
Смотрите также
|
C++ документация
для
aligned_alloc
|