Namensräume
Varianten
Aktionen

C++ Attribut: assume (seit C++23)

Von cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
Attribute
assume
(C++23)
(C++11)(bis C++26)
(C++14)
(C++20)
(C++17)
(C++11)
(C++20)
 

Gibt an, dass der gegebene Ausdruck an einem bestimmten Punkt immer zu true ausgewertet wird, um Compiler-Optimierungen basierend auf den gegebenen Informationen zu ermöglichen.

Inhalt

[bearbeiten] Syntax

[[assume( Ausdruck )]]
expression - beliebiger Ausdruck (außer nicht geklammerte Komma-Ausdrücke)

[bearbeiten] Erklärung

[[assume]] kann nur auf eine leere Anweisung angewendet werden, wie in [[assume(x > 0)]];. Diese Anweisung wird als Annahme bezeichnet.

Ausdruck wird kontextuell in bool konvertiert, aber er wird nicht ausgewertet (er ist immer noch potenziell ausgewertet).

  • Wenn der konvertierte Ausdruck an der Stelle, an der die Annahme erscheint, zu true ausgewertet würde, hat die Annahme keine Auswirkung.
  • Andernfalls hat die Auswertung der Annahme undefiniertes Verhalten zur Laufzeit.

[bearbeiten] Hinweise

Da Annahmen zu undefiniertem Verhalten zur Laufzeit führen, wenn sie nicht zutreffen, sollten sie sparsam verwendet werden.

Eine korrekte Verwendung ist, nach Assertions Annahmen folgen zu lassen

assert(x > 0);     // trigger an assertion when NDEBUG is not defined and x > 0 is false
[[assume(x > 0)]]; // provide optimization opportunities when NDEBUG is defined

[bearbeiten] Beispiel

#include <cmath>
 
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);
}

[bearbeiten] Fehlermeldungen

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 2924 C++23 Ein Verstoß gegen eine Annahme würde zu undefiniertem Verhalten führen führt zu undefiniertem Verhalten zur Laufzeit

[bearbeiten] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 9.12.3 Assumption attribute [dcl.attr.assume]

[bearbeiten] Siehe auch

markiert einen unerreichbaren Ausführungspunkt
(funktion) [bearbeiten]
contract_assert-Anweisung (C++26) verifiziert eine interne Bedingung während der Ausführung[edit]

[bearbeiten] Externe Links

1.  Clang Sprach-Erweiterungs-Dokumentation: __builtin_assume.
2.  Clang Attribut-Referenz-Dokumentation: assume.
3.  MSVC-Dokumentation: __assume Built-in.
4.  GCC-Dokumentation: __attribute__((assume(...))).