Spec-Zone.ru › C++

std::assume_aligned

Определён в заголовочном файле <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);
    // Use p1, not p, to ensure benefit from the alignment assumption.
    // However, the program has undefined behavior if p is not aligned
    // regardless of whether p1 is used.
}

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

Макрос проверки поддержки Значение Стандарт Возможность
__cpp_lib_assume_aligned 201811L (C++20) std::assume_aligned

Пример

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/assume_aligned

Spec-Zone.ru

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