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 |