std::aligned_alloc
| Определено в заголовочном файле <cstdlib>
|
||
void* aligned_alloc( std::size_t alignment, std::size_t size ); |
(начиная с C++17) | |
Выделяет size байт неинициализированного хранилища, выравнивание которого определяется alignment (неявное создание объектов в целевой области). Параметр size должен быть целым числом, кратным alignment.
Следующие функции должны быть потокобезопасными:
- Библиотечные версии operator new и operator delete
- Пользовательские заменяющие версии глобальных operator new и operator delete
- std::calloc, std::malloc, std::realloc, std::aligned_alloc, std::free
Вызовы этих функций, которые выделяют или освобождают конкретную единицу памяти, происходят в одном общем порядке, и каждый такой вызов освобождения происходит до следующего выделения памяти (если таковое имеется) в этом порядке.
Параметры
| alignment | — | определяет выравнивание. Должно быть допустимое выравнивание, поддерживаемое реализацией. |
| size | — | количество байтов для выделения. Целое кратное alignment.
|
Возвращаемое значение
В случае успеха возвращает указатель на начало выделенной памяти. Чтобы избежать утечки памяти, возвращаемый указатель должен быть освобождён с помощью std::free() или std::realloc().
В случае ошибки возвращает нулевой указатель.
Примечание
Передача size, который не является целым кратным alignment, или alignment, который недействителен или не поддерживается реализацией, приводит к сбою функции и возврату нулевого указателя (C11, как опубликовано, в этом случае указано неопределённое поведение, это было исправлено DR460).
В качестве примера требования "поддержки реализацией", функция POSIX posix_memalign принимает любой alignment, который является степенью двойки и кратен sizeof(void*), и реализации aligned_alloc на основе POSIX наследуют эти требования.
Фундаментальные выравнивания поддерживаются всегда. Если alignment является степенью двойки и не превышает alignof(std::max_align_t), aligned_alloc может просто вызвать std::malloc.
Обычная std::malloc выравнивает память, подходящую для любого типа объекта, с фундаментальным выравниванием. Эта функция полезна для чрезмерного распределения, например, для SSE, строки кэша или границы страницы VM.
Эта функция не поддерживается в Microsoft библиотеке Времени Выполнения C, поскольку её реализация std::free is не может обрабатывать выровненные выделения любого рода. Вместо этого MS CRT предоставляет _aligned_malloc (освобождение осуществляется с помощью _aligned_free).
Пример
#include <cstdio>
#include <cstdlib>
int main()
{
int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1));
std::printf("адрес, выровненный по умолчанию: %p\n", static_cast<void*>(p1));
std::free(p1);
int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
std::printf("адрес, выровненный по 1024 байтам: %p\n", static_cast<void*>(p2));
std::free(p2);
}
Возможный вывод:
адрес, выровненный по умолчанию: 0x2221c20
адрес, выровненный по 1024 байтам: 0x2222400
Смотрите также
(C++11)(устарело в C++23) |
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера (шаблон класса) |
Документация C по aligned_alloc
| |