sizeof
operator
객체 또는 타입의 크기를 조회합니다.
객체의 실제 크기를 알아야 할 때 사용됩니다.
목차 |
구문
sizeof(
type
)
|
(1) | ||||||||
sizeof
expression
|
(2) | ||||||||
| type | - | a type-id (참조 타입 명명 ) |
| expression | - |
연산자 우선순위
가
sizeof
보다 낮지 않은 표현식 (예:
sizeof a
+
b
는
(
sizeof a
)
+
b
로 파싱되며
sizeof
(
a
+
b
)
가 아님)
|
sizeof
표현식의 결과는
상수 표현식
으로서
std::size_t
타입을 가집니다.
참고 사항
컴퓨터 아키텍처에 따라, byte 는 8비트 이상으로 구성될 수 있으며, 정확한 수치는 CHAR_BIT 에 기록됩니다.
다음
sizeof
표현식은 항상
1
로 평가됩니다:
- sizeof ( char )
- sizeof ( signed char )
- sizeof ( unsigned char )
태그 내의 C++ 코드는 번역하지 않고 원본을 그대로 유지했습니다. 이 목록은 C++의 char 자료형 관련 sizeof 연산자 사용 예시를 보여주고 있습니다.
|
(C++17부터) |
|
(C++20부터) |
sizeof
는 함수 타입, 불완전 타입, 또는 비트 필드
lvalues
(C++11까지)
glvalues
(C++11부터)
와 함께 사용할 수 없습니다.
참조 타입에 적용될 경우, 결과는 참조된 타입의 크기입니다.
클래스 타입에 적용될 때, 그 결과는 해당 클래스의 완전한 객체가 차지하는 바이트 수이며, 그러한 객체를 배열에 배치하기 위해 필요한 추가 패딩을 포함합니다. potentially-overlapping subobject 가 차지하는 바이트 수는 해당 객체의 크기보다 작을 수 있습니다.
sizeof
의 결과는 항상 0이 아닙니다. 빈 클래스 타입에 적용된 경우에도 마찬가지입니다.
표현식에 적용될 때,
sizeof
는
표현식을 평가하지 않습니다
(즉, 표현식은 평가되지 않는 피연산자입니다)
(C++11부터)
. 다형성 객체를 지정하는 표현식인 경우에도 결과는 표현식의 정적 타입 크기입니다. lvalue-to-rvalue, array-to-pointer, 또는 function-to-pointer 변환은 수행되지 않습니다.
임시 구체화
는 prvalue 인수에 대해 (형식적으로) 수행됩니다: 인수가 파괴 가능하지 않으면 프로그램은 ill-formed입니다.
(C++17부터)
키워드
예제
예시 출력은 64비트 포인터와 32비트 int를 가진 시스템(일명 LP64 또는 LLP64 )에 해당합니다.
#include <cstdlib> #include <iostream> struct Empty { }; struct Base { int a; }; struct Derived : Base { int b; }; struct Bit { unsigned bit: 1; }; struct CharChar { char c; char c2; }; struct CharCharInt { char c; char c2; int i; }; struct IntCharChar { int i; char c; char c2; }; struct CharIntChar { char c; int i; char c2; }; struct CharShortChar { char c; short s; char c2; }; int main() { Empty e; Derived d; Base& b = d; [[maybe_unused]] Bit bit; int a[10]; auto f = [&]() { return sizeof(int[10]) == sizeof a ? throw 1 : e; }; // f(); // 반환 타입은 Empty이지만 항상 1을 throw함 auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; }; println( "1) 빈 클래스의 sizeof: ", sizeof e ); println( "2) 포인터의 sizeof: ", sizeof &e ); println( "3) Bit 클래스의 sizeof: ", sizeof(Bit) ); println( "4) int[10] 배열의 sizeof: ", sizeof(int[10]) ); println( "5) 10개 int 배열 a의 sizeof: ", sizeof a ); println( "6) 10개 int 배열의 길이: ", ((sizeof a) / (sizeof *a)) ); println( "7) 10개 int 배열의 길이 (2): ", ((sizeof a) / (sizeof a[0])) ); println( "8) Derived 클래스의 sizeof: ", sizeof d ); println( "9) Base를 통한 Derived의 sizeof: ", sizeof b ); println( "A) unsigned의 sizeof: ", sizeof(unsigned) ); println( "B) int의 sizeof: ", sizeof(int) ); println( "C) short의 sizeof: ", sizeof(short) ); println( "D) char의 sizeof: ", sizeof(char) ); println( "E) CharChar의 sizeof: ", sizeof(CharChar) ); println( "F) CharCharInt의 sizeof: ", sizeof(CharCharInt) ); println( "G) IntCharChar의 sizeof: ", sizeof(IntCharChar) ); println( "H) CharIntChar의 sizeof: ", sizeof(CharIntChar) ); println( "I) CharShortChar의 sizeof: ", sizeof(CharShortChar) ); println( "J) f()의 sizeof: ", sizeof f() ); println( "K) Base::a의 sizeof: ", sizeof Base::a ); // println( "함수의 sizeof: ", sizeof(void()) ); // 오류 // println( "불완전 타입의 sizeof: ", sizeof(int[]) ); // 오류 // println( "비트 필드의 sizeof: ", sizeof bit.bit ); // 오류 }
가능한 출력:
1) 빈 클래스의 sizeof: 1 2) 포인터의 sizeof: 8 3) Bit 클래스의 sizeof: 4 4) 10개 int 배열의 sizeof(int[10]): 40 5) 10개 int 배열 a의 sizeof: 40 6) 10개 int 배열의 길이: 10 7) 10개 int 배열의 길이 (2): 10 8) Derived 클래스의 sizeof: 8 9) Base를 통한 Derived의 sizeof: 4 A) unsigned의 sizeof: 4 B) int의 sizeof: 4 C) short의 sizeof: 2 D) char의 sizeof: 1 E) CharChar의 sizeof: 2 F) CharCharInt의 sizeof: 8 G) IntCharChar의 sizeof: 8 H) CharIntChar의 sizeof: 12 I) CharShortChar의 sizeof: 6 J) f()의 sizeof: 1 K) Base::a의 sizeof: 4
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| CWG 1553 | C++11 |
sizeof
비트 필드 xvalue와 함께 사용 가능했음
|
금지됨 |
참고 항목
alignof
(C++11)
|
타입의 정렬 요구 사항을 조회함
(연산자) |
sizeof...
operator
(C++11)
|
pack 내 요소의 개수를 조회함 |
|
모든 기본 숫자 타입의 속성을 조회하기 위한 인터페이스를 제공함
(클래스 템플릿) |
|
|
C documentation
for
sizeof
|
|