Атрибут C++: assume (с C++23)
Указывает, что выражение всегда будет равно true в данной точке.
Синтаксис
[[assume( выражение )]] |
| выражение | - | выражение, которое должно быть равно true |
Объяснение
Может быть применен только к пустому оператору, как в [[assume(x > 0)]];. Такой оператор называется предположением. Если выражение (преобразованное контекстно в bool) не будет равно true в месте, где происходит предположение, поведение является неопределённым. В противном случае оператор ничего не делает. В частности, выражение не оценивается (но оно всё ещё возможно оценивается).
Цель предположения — позволить оптимизации компилятора на основе предоставленной информации.
Выражение не может быть выражением оператора запятой запятая, но заключение выражения в скобки позволит использовать оператор запятой.
Примечания
Если выражение приведет к неопределённому поведению или вызовет исключение, то оно не равно true.
Поскольку предположения приводят к неопределённому поведению, если они не выполняются, их следует использовать с осторожностью. Они не предназначены для документирования предопределённых условий функции или для диагностирования нарушений предопределённых условий. Также не следует предполагать, не проверяя, что компилятор действительно использует какое-либо конкретное предположение.
Пример
void f(int& x, int y)
{
void g(int);
void h();
[[assume(x > 0)]]; // Compiler may assume x is positive
g(x / 2); // More efficient code possibly generated
x = 3;
int z = x;
[[assume((h(), x == z))]]; // Compiler may assume x would have the same value after
// calling h
// The assumption does not cause a call to h
h();
g(x); // Compiler may replace this with g(3);
h();
g(x); // Compiler may NOT replace this with g(3);
// An assumption applies only at the point where it appears
z = std::abs(y);
[[assume((g(z), true))]]; // Compiler may assume g(z) will return
g(z); // Due to above and below assumptions, compiler may replace this with g(10);
[[assume(y == -10)]]; // Undefined behavior if y != -10 at this point
[[assume((x - 1) * 3 == 12)]];
g(x); // Compiler may replace this with g(5);
}Ссылки
- Стандарт C++23 (ISO/IEC 14882:2023):
- 9.12.3 Атрибут предположения [dcl.attr.assume]
См. также
|
(C++23) | помечает недостижимую точку выполнения (функция) |
Внешние ссылки
| 1. | Документация расширений языка Clang: __builtin_assume. |
| 2. | Документация атрибутов Clang: assume. |
| 3. | Документация MSVC: __assume встроенная функция. |
| 4. | Документация GCC: __attribute__((assume(...))). |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/attributes/assume