aligned_alloc
Определено в заголовке <stdlib.h> | ||
|---|---|---|
void *aligned_alloc( size_t alignment, size_t size ); | (с C11) |
Выделяет size байт неинициализированного хранилища с выровненным полем, указанным в alignment. Параметр size должен быть целым кратным alignment.
aligned_alloc — потокобезопасная функция: она ведет себя так, как будто обращается только к областям памяти, видимым через свой аргумент, а не к любому статическому хранилищу.
Предыдущий вызов free или 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).
Пример
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1 = malloc(10*sizeof *p1);
printf("default-aligned addr: %p\n", (void*)p1);
free(p1);
int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
printf("1024-byte aligned addr: %p\n", (void*)p2);
free(p2);
}Возможный вывод:
default-aligned addr: 0x1e40c20 1024-byte aligned addr: 0x1e41000
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- 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 |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/memory/aligned_alloc