Namespaces
Variants

std:: assume_aligned

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Определено в заголовке <memory>
template < std:: size_t N, class T >
constexpr T * assume_aligned ( T * ptr ) ;
(начиная с C++20)

Сообщает реализации, что объект, на который указывает ptr , выровнен как минимум на N . Реализация может использовать эту информацию для генерации более эффективного кода, но может делать это предположение только если доступ к объекту осуществляется через возвращаемое значение assume_aligned .

N должна быть степенью двойки. Поведение не определено, если ptr не указывает на объект типа T (игнорируя cv-квалификаторы на каждом уровне), или если выравнивание объекта меньше N .

Содержание

Возвращаемое значение

ptr .

Исключения

Ничего не выбрасывает.

Примечания

Чтобы программа могла воспользоваться оптимизациями, предоставляемыми assume_aligned , важно обращаться к объекту через возвращаемое значение:

void f(int* p)
{
    int* p1 = std::assume_aligned<256>(p);
    // Используйте p1, а не p, чтобы гарантировать выгоду от предположения о выравнивании.
    // Однако программа имеет неопределенное поведение, если p не выровнен,
    // независимо от того, используется ли p1.
}

Программа сама должна обеспечивать выполнение предположения о выравнивании. Вызов assume_aligned не заставляет компилятор проверять или обеспечивать это.

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_assume_aligned 201811L (C++20) std::assume_aligned

Пример

Смотрите также

alignof (C++11) запрашивает требования к выравниванию типа
(оператор)
alignas (C++11) указывает, что память для переменной должна быть выровнена на определенное значение
(спецификатор)
(since C++11) (deprecated in C++23)
определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера
(шаблон класса)
(C++11)
выравнивает указатель в буфере
(функция)
[[ assume ( expression )]]
(C++23)
указывает, что выражение всегда будет вычисляться в true в данной точке
(спецификатор атрибута)