Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовке <cstdlib>
void * aligned_alloc ( std:: size_t alignment, std:: size_t size ) ;
(начиная с C++17)

Выделяет size байт неинициализированной памяти с выравниванием, заданным параметром alignment ( неявно создавая объекты в целевой области). Параметр size должен быть целым кратным значения alignment .

Следующие функции должны быть потокобезопасными:

Вызовы этих функций, которые выделяют или освобождают определённую единицу памяти, происходят в едином общем порядке, и каждый такой вызов освобождения происходит-раньше следующего выделения (если таковое имеется) в этом порядке.

Содержание

Параметры

alignment - задает выравнивание. Должно быть допустимым выравниванием, поддерживаемым реализацией.
size - количество байт для выделения. Должно быть целым кратным alignment .

Возвращаемое значение

При успешном выполнении возвращает указатель на начало вновь выделенной памяти. Чтобы избежать утечки памяти, возвращаемый указатель должен быть освобожден с помощью std::free или std::realloc .

При неудаче возвращает нулевой указатель.

Примечания

Передача size , который не является целым кратным alignment , или alignment , который не является допустимым или не поддерживается реализацией, приводит к неудачному выполнению функции и возврату нулевого указателя (в C11, как опубликовано, в этом случае было указано неопределенное поведение, что было исправлено DR460 ).

В качестве примера требования «поддерживается реализацией», функция POSIX posix_memalign принимает любое alignment , которое является степенью двойки и кратным sizeof ( void * ) , и POSIX-совместимые реализации aligned_alloc наследуют это требование.

Фундаментальные выравнивания всегда поддерживаются. Если alignment является степенью двойки и не превышает alignof ( std:: max_align_t ) , aligned_alloc может просто вызывать std::malloc .

Обычный std::malloc выравнивает память, подходящую для любого типа объектов с фундаментальным выравниванием. Эта функция полезна для сверхвыровненных выделений памяти, таких как выравнивание по границе SSE , кеш-линии или страницы виртуальной памяти .

Эта функция не поддерживается в библиотеке Microsoft C Runtime, поскольку её реализация std::free не способна обрабатывать выровненные выделения памяти любого типа. Вместо этого MS CRT предоставляет _aligned_malloc (который должен освобождаться с помощью _aligned_free ).

Пример

#include <cstdio>
#include <cstdlib>
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

Возможный вывод:

default-aligned address:   0x2221c20
1024-byte aligned address: 0x2222400

Смотрите также

(since C++11) (deprecated in C++23)
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера
(шаблон класса)
Документация C для aligned_alloc