std::dynamic_extent

std::dynamic_extent (동적 범위 상수)

std::span 등에서 "정적으로 알려지지 않은" 동적 범위를 나타내는 상수예요. std::size_t 타입의 값으로, 일반적으로 어떤 타입이 값을 정적으로가 아니라 동적으로 저장할 것임을 나타내요. C++20부터 있어요.

출처: cppreference

본문

<span> 헤더에 정의돼 있어요.

inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();

std::dynamic_extentstd::size_t 타입의 상수로, std::dynamic_extent를 사용하는 어떤 타입이 그 값을(예: 크기) 정적으로 타입 안에 알려두지 않고 동적으로 저장할 것임을 나타내는 데 일반적으로 쓰여요.

여러 문맥에서 사용돼요.

  • 정적 범위와 동적 범위의 std::span을 구분.
  • std::extents에서 특정 rank 인덱스의 범위(extent)가 동적으로 저장될 것임을 표시 (C++23).
  • std::mdspan의 패딩 레이아웃이 패딩 값을 동적으로 저장할 것임을 표시 (C++26).

참고

std::size_t는 부호 없는 타입이므로, 동등한 정의는 다음과 같아요.

inline constexpr std::size_t dynamic_extent = -1;

(정수 변환 규칙 참조 — -1이 부호 없는 타입으로 변환되면 std::numeric_limits<std::size_t>::max()가 돼요.)

예제를 보면요.

#include <array>
#include <cassert>
#include <cstddef>
#include <span>

int main()
{
    int a[3]{1, 2, 3};
    std::span<int, 3> s3{a};          // 정적 범위 3
    std::span<int> s{a};              // dynamic_extent, 동적 범위

    assert(s3.extent == 3);
    assert(s.extent == std::dynamic_extent);
    assert(s.size() == 3);            // 동적이라도 size()로 알 수 있어요
}

이렇게 정적 범위 std::span(타입에 크기 인코딩)과 동적 범위 std::span(실행 시 크기)을 구분하는 기준이 돼요.

더 알아보기 (Learn more)

cppreference