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

Вызовы этих функций, выделяющие или освобождающие определённую область хранилища, образуют единый полный порядок, и каждый такой вызов освобождения предшествует по отношению 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

См. также

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/cpp/memory/c/aligned_alloc

Spec-Zone.ru

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