Spec-Zone.ru › C

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API