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 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
См. также
|
(C++11)(устарело в C++23) |
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера (шаблон класса) |
C документация для aligned_alloc |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/c/aligned_alloc