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 문서 |