types_size_t

types_size_t (size_t 타입)

std::size_t는 C++ 표준 라이브러리에서 객체의 크기를 나타내는 부호 없는 정수 타입이에요. sizeof 연산자와 같은 연산의 결과 타입으로 사용되며, 배열 인덱싱이나 루프 카운팅에 널리 쓰여요. 이 페이지에서는 std::size_t의 정의, 주요 특징, 그리고 사용할 때 주의할 점을 알아볼게요.

출처: cppreference

본문

헤더 및 정의

다음 헤더에 정의되어 있어요:

Defined in header
Defined in header
Defined in header
Defined in header
Defined in header
Defined in header (C++17부터)
Defined in header
typedef /* implementation-defined */ size_t ;

std::size_t는 다음 연산자들의 결과 타입인 부호 없는 정수 타입이에요:

  • sizeof
  • sizeof... (C++11부터), alignof (C++11부터)

만약 프로그램이 지나치게 큰 타입(즉, 객체 표현의 바이트 수가 std::size_t로 표현 가능한 최댓값을 초과하는 경우)을 만들려고 하면, 그 프로그램은 ill-formed예요.

std::size_t의 비트 폭은 16보다 작지 않아요. (C++11부터)

참고 사항 (Notes)

std::size_t는 모든 타입(배열 포함)의 이론적으로 가능한 객체의 최대 크기를 저장할 수 있어요. 많은 플랫폼(세그먼트 주소 지정을 사용하는 시스템은 예외)에서 std::size_t는 비멤버 포인터의 값을 안전하게 저장할 수 있으며, 이 경우 std::uintptr_t와 동의어예요.

std::size_t는 배열 인덱싱과 루프 카운팅에 흔히 사용돼요. unsigned int 같은 다른 타입을 배열 인덱싱에 사용하는 프로그램은 64비트 시스템에서 인덱스가 UINT_MAX를 초과하거나 32비트 모듈러 연산에 의존할 때 실패할 수 있어요.

std::string, std::vector 같은 C++ 컨테이너를 인덱싱할 때는 해당 컨테이너가 제공하는 중첩 타입 size_type이 적절해요. 이 타입은 보통 std::size_t의 동의어로 정의돼요.

std::size_t의 선언이 다른 표준 라이브러리 헤더에서 사용 가능한지 여부는 명세되지 않았어요. 구현은 표준이 std::size_t를 사용하도록 요구하는 경우에도 이 이름을 도입하지 않을 수 있어요.

std::size_t용 정수 리터럴 접미사는 z 또는 Z와 u 또는 U의 조합이에요 (즉, zu, zU, Zu, ZU, uz, uZ, Uz, UZ). (C++23부터)

예제 (Example)

#include <array>
#include <cstddef>
#include <iostream>

int main()
{
    std::array<std::size_t, 10> a;
    
    // Example with C++23 std::size_t literal
    for (auto i = 0uz; i != a.size(); ++i)
        std::cout << (a[i] = i) << ' ';
    std::cout << '\n';
    
    // Example of decrementing loop
    for (std::size_t i = a.size(); i--;)
        std::cout << a[i] << ' ';
    std::cout << '\n';
    
    // Note the naive decrementing loop:
    //  for (std::size_t i = a.size() - 1; i >= 0; --i) ...
    // is an infinite loop, because unsigned numbers are always non-negative
}

출력:

0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0

결함 보고서 (Defect reports)

다음 동작 변경 결함 보고서는 이전에 발표된 C++ 표준에 소급 적용됐어요.

DR 적용 대상 게시된 동작 올바른 동작
CWG 1122 C++98 std::size_t가 순환적으로 정의되었어요 [ 1 ] 구현 정의로 바뀌었어요
CWG 1464 C++98 객체 크기가 std::size_t로 표현되지 않을 수 있었어요 그러한 타입은 ill-formed예요
  • ↑ std::size_t의 정의는 C에서 size_t의 정의, 즉 "sizeof의 결과 타입"과 정확히 같았어요. C에서는 sizeof의 결과 타입이 구현 정의 부호 없는 정수 타입이므로 순환 정의가 없어요.

참고 문헌 (References)

  • C++23 표준 (ISO/IEC 14882:2024):
    • 6.8.4 Compound types [basic.compound] (p: 79-80)
    • 7.6.2.5 Sizeof [expr.sizeof] (p: 136)
    • 7.6.2.6 Alignof [expr.alignof] (p: 136)
    • 17.2.4 Sizes, alignments, and offsets [support.types.layout] (p: 504-505)
  • C++20 표준 (ISO/IEC 14882:2020):
    • 6.8.3 Compound types [basic.compound] (p: 75-76)
    • 7.6.2.5 Sizeof [expr.sizeof] (p: 129-130)
    • 7.6.2.6 Alignof [expr.alignof] (p: 130)
    • 17.2.4 Sizes, alignments, and offsets [support.types.layout] (p: 507-508)
  • C++17 표준 (ISO/IEC 14882:2017):
    • 6.9.2 Compound types [basic.compound] (p: 81-82)
    • 8.3.3 Sizeof [expr.sizeof] (p: 121-122)
    • 8.3.6 Alignof [expr.alignof] (p: 129)
    • 21.2.4 Sizes, alignments, and offsets [support.types.layout] (p: 479)
  • C++14 표준 (ISO/IEC 14882:2014):
    • 3.9.2 Compound types [basic.compound] (p: 73-74)
    • 5.3.3 Sizeof [expr.sizeof] (p: 109-110)
    • 5.3.6 Alignof [expr.alignof] (p: 116)
    • 18.2 Types [support.types] (p: 443-444)
  • C++11 표준 (ISO/IEC 14882:2011):
    • 5.3.3 Sizeof [expr.sizeof] (p: 111)
    • 5.3.6 Alignof [expr.alignof] (p: 116)
    • 18.2 Types [support.types] (p: 454-455)
  • C++03 표준 (ISO/IEC 14882:2003):
    • 5.3.3 Sizeof [expr.sizeof] (p: 79)
  • C++98 표준 (ISO/IEC 14882:1998):
    • 5.3.3 Sizeof [expr.sizeof] (p: 77)

같이 보기 (See also)

ptrdiff_t 두 포인터를 뺄 때 반환되는 부호 있는 정수 타입 (typedef)
offsetof 표준 레이아웃 타입의 시작부터 지정된 멤버까지의 바이트 오프셋 (함수 매크로)
integer literals 이진수 (C++14부터), 십진수, 팔진수 또는 십육진수 정수 타입의 리터럴
C documentation for size_t C 언어에서의 size_t 문서

더 알아보기 (Learn more)

cppreference