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
Вызовы этих функций, выделяющие или освобождающие определённую область хранилища, образуют единый полный порядок, и каждый такой вызов освобождения предшествует по отношению happens-before следующему выделению (если оно есть) в этом порядке.
Параметры
| 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, строки кэша или страницы виртуальной памяти.
Эта функция не поддерживается в библиотеке 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/cpp/memory/c/aligned_alloc