numeric_saturating_add
numeric_saturating_add (포화 덧셈)
std::saturating_add는 포화 덧셈 x + y를 계산하는 함수예요. C++26부터 사용할 수 있어요.
출처: cppreference
본문
<numeric> 헤더에 정의되어 있고, 시그니처는 다음과 같아요.
template< class T >
constexpr T saturating_add( T x, T y ) noexcept;
(since C++26)
포화 덧셈 x + y를 계산해요. 이 연산은 (정수의 내장 산술 연산과 달리) 무한 범위의 수학적 연산처럼 동작해요. 그 결과를 q라고 해요.
다음을 반환해요:
- q를 T 타입의 값으로 표현할 수 있으면 q. 그 외에는,
- q에 더 가까운 T 타입의 가장 큰 값 또는 가장 작은 값.
이 오버로드는 T가 정수 타입일 때만 오버로드 해석에 참여해요. 즉 signed char, short, int, long, long long, 확장 부호 정수 타입, 또는 그런 타입의 부호 없는 버전이에요. 특히 T는 (cv 한정된) bool, char, wchar_t, char8_t, char16_t, char32_t가 아니어야 해요. 이 타입들은 산술용이 아니기 때문이에요.
매개변수 (Parameters)
- x, y — 정수 값
반환값 (Return value)
포화된 x + y.
참고 (Notes)
정수의 내장 산술 연산자와 달리, x와 y 인자에는 정수 승격(integral promotion)이 적용되지 않아요.
서로 다른 타입의 두 인자를 전달하면 호출이 컴파일되지 않아요. 즉 템플릿 인자 추론에 대한 동작은 std::min이나 std::max와 같아요.
대부분의 현대 하드웨어 아키텍처는 SIMD 벡터에 대한 포화 산술을 효율적으로 지원해요. x86의 SSE2, ARM의 NEON 등이 그렇지요.
| 피처 테스트 매크로 | 값 | 표준 | 기능 |
|---|---|---|---|
__cpp_lib_saturation_arithmetic |
202311L | (C++26) | 포화 산술 |
| 202603L | (C++26) | 포화 산술 함수 이름 변경 |
가능한 구현 (Possible implementation)
libstdc++ (GCC), libc++ (Clang) 참고.
예제 (Example)
이 코드를 실행해 봐요.
#include <climits>
#include <limits>
#include <numeric>
static_assert(CHAR_BIT == 8);
static_assert(UCHAR_MAX == 255);
int main()
{
constexpr int a = std::saturating_add(3, 4); // no saturation occurs, T = int
static_assert(a == 7);
constexpr unsigned char b = std::saturating_add<unsigned char>(UCHAR_MAX, 4); // saturated
static_assert(b == UCHAR_MAX);
}