std:: add_sat
|
Definiert im Header
<numeric>
|
||
|
template
<
class
T
>
constexpr T add_sat ( T x, T y ) noexcept ; |
(seit C++26) | |
Berechnet die
Sättigungs-
Addition
x
+
y
. Diese Operation (im Gegensatz zu eingebauten
arithmetischen Operationen auf Ganzzahlen
) verhält sich so, als wäre sie eine mathematische Operation mit einem
unendlichen
Wertebereich. Sei
q
das Ergebnis einer solchen Operation.
Gibt zurück:
-
q, fallsqals Wert vom TypTdarstellbar ist. Andernfalls, -
den größten oder kleinsten Wert vom Typ
T, je nachdem, welcher näher anqliegt.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn
T
ein
Ganzzahltyp
ist, das heißt:
signed
char
,
short
,
int
,
long
,
long
long
, ein erweiterter Ganzzahltyp mit Vorzeichen oder eine vorzeichenlose Version solcher Typen. Insbesondere darf
T
nicht (möglicherweise cv-qualifiziert)
bool
,
char
,
wchar_t
,
char8_t
,
char16_t
oder
char32_t
sein, da diese Typen nicht für arithmetische Operationen vorgesehen sind.
Inhaltsverzeichnis |
Parameter
| x, y | - | ganzzahlige Werte |
Rückgabewert
Saturated x + y .
Hinweise
Im Gegensatz zu den eingebauten arithmetischen Operatoren für Ganzzahlen findet keine integral promotion auf die x - und y -Argumente statt.
Wenn zwei Argumente unterschiedlichen Typs übergeben werden, schlägt der Aufruf zur Kompilierung fehl, d.h. das Verhalten in Bezug auf template argument deduction ist dasselbe wie für std::min oder std::max .
Die meisten modernen Hardware-Architekturen bieten effiziente Unterstützung für Saturation Arithmetic bei SIMD-Vektoren , einschließlich SSE2 für x86 und NEON für ARM .
| Feature-Test Makro | Wert | Std | Funktion |
|---|---|---|---|
__cpp_lib_saturation_arithmetic
|
202311L
|
(C++26) | Sättigungsarithmetik |
Mögliche Implementierung
Siehe libstdc++ (gcc) .
Beispiel
Kann auf Compiler Explorer vorgezeigt werden.
#include <climits> #include <limits> #include <numeric> static_assert(CHAR_BIT == 8); static_assert(UCHAR_MAX == 255); int main() { constexpr int a = std::add_sat(3, 4); // keine Sättigung tritt auf, T = int static_assert(a == 7); constexpr unsigned char b = std::add_sat<unsigned char>(UCHAR_MAX, 4); // gesättigt static_assert(b == UCHAR_MAX); constexpr unsigned char c = std::add_sat(UCHAR_MAX, 4); // nicht gesättigt, T = int // add_sat(int, int) gibt int tmp == 259 zurück, // dann schneidet die Zuweisung 259 % 256 == 3 ab static_assert(c == 3); // unsigned char d = std::add_sat(252, c); // Fehler: inkonsistente Ableitungen für T constexpr unsigned char e = std::add_sat<unsigned char>(251, a); // gesättigt static_assert(e == UCHAR_MAX); // 251 hat den Typ T = unsigned char, `a` wird in unsigned char-Wert konvertiert; // könnte eine int -> unsigned char Konvertierungswarnung für `a` erzeugen constexpr signed char f = std::add_sat<signed char>(-123, -3); // nicht gesättigt static_assert(f == -126); constexpr signed char g = std::add_sat<signed char>(-123, -13); // gesättigt static_assert(g == std::numeric_limits<signed char>::min()); // g == -128 }
Siehe auch
|
(C++26)
|
Saturierende Subtraktionsoperation für zwei Ganzzahlen
(Funktionsschablone) |
|
(C++26)
|
Saturierende Multiplikationsoperation für zwei Ganzzahlen
(Funktionsschablone) |
|
(C++26)
|
Saturierende Divisionsoperation für zwei Ganzzahlen
(Funktionsschablone) |
|
(C++26)
|
Gibt einen auf den Wertebereich eines anderen Ganzzahltyps begrenzten Ganzzahlwert zurück
(Funktionsschablone) |
|
(C++17)
|
Begrenzt einen Wert zwischen einem Paar von Grenzwerten
(Funktionsschablone) |
|
(C++20)
|
Prüft, ob ein Ganzzahlwert im Wertebereich eines gegebenen Ganzzahltyps liegt
(Funktionsschablone) |
|
[static]
|
Gibt den kleinsten endlichen Wert des gegebenen Nicht-Gleitkommatyps oder den kleinsten positiven Normalwert des gegebenen Gleitkommatyps zurück
(öffentliche statische Elementfunktion von
std::numeric_limits<T>
)
|
|
[static]
|
Gibt den größten endlichen Wert des gegebenen Typs zurück
(öffentliche statische Elementfunktion von
std::numeric_limits<T>
)
|
Externe Links
| 1. | Eine verzweigungsfreie Implementierung von Saturation Arithmetic — Locklessinc.com, 2012 |
| 2. | C++ Weekly - Ep 459 - C++26's Saturating Math Operations — Youtube.com, 2024-12-16 |