Namespaces
Variants

aligned_alloc

From cppreference.net
Определено в заголовочном файле <stdlib.h>
void * aligned_alloc ( size_t alignment, size_t size ) ;
(начиная с 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 ).

Пример

#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: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