Namespaces
Variants

std:: add_sat

From cppreference.net
Saturation arithmetic
Functions
add_sat
(C++26)
(C++26)
(C++26)
(C++26)
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 , falls q als Wert vom Typ T darstellbar ist. Andernfalls,
  • den größten oder kleinsten Wert vom Typ T , je nachdem, welcher näher an q liegt.

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)
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