Пространства имён
Варианты
Действия

std::aligned_alloc

Материал из cppreference.com
< cpp‎ | memory‎ | c
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
Динамическое управление памятью
no section name
Ограниченные алгоритмы неинициализированной памяти
no section name
Поддержка сбора мусора
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)
(C++11)(до C++23)



no section name
 
Определено в заголовочном файле <cstdlib>
void* aligned_alloc( std::size_t alignment, std::size_t size );
(начиная с C++17)

Выделяет size байт неинициализированного хранилища, выравнивание которого определяется alignment (неявное создание объектов в целевой области). Параметр size должен быть целым числом, кратным alignment.

Следующие функции должны быть потокобезопасными:

Вызовы этих функций, которые выделяют или освобождают конкретную единицу памяти, происходят в одном общем порядке, и каждый такой вызов освобождения происходит до следующего выделения памяти (если таковое имеется) в этом порядке.

Содержание

[править] Параметры

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