C++ Attribut: assume (seit C++23)
Von cppreference.com
< cpp | language | attributes
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
| (C++23) |
markiert einen unerreichbaren Ausführungspunkt (funktion) |
contract_assert-Anweisung (C++26) |
verifiziert eine interne Bedingung während der Ausführung |
[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(...))). |