Spec-Zone.ru › C++

Атрибут 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]

См. также

unreachable
(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

Spec-Zone.ru

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