std::assume_aligned
Определено в заголовке <memory> | ||
|---|---|---|
template< std::size_t N, class T > [[nodiscard]] 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) | указывает, что хранение для переменной должно быть выровнено на определённую величину |
|
(C++11)(устарело в C++23) | определяет тип, подходящий для использования в качестве неинициализированного хранилища для типов заданного размера (шаблон класса) |
|
(C++11) | выравнивает указатель в буфере (функция) |
[[assume(expression)]](C++23) | указывает, что выражение всегда будет оцениваться как true в заданной точке (спецификатор атрибута) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/assume_aligned