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
*
)
, и 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
|
|