Spec-Zone.ru › C++

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

См. также

aligned_storage
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API