Namespaces
Variants

sizeof operator

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

객체 또는 타입의 크기를 조회합니다.

객체의 실제 크기를 알아야 할 때 사용됩니다.

목차

구문

sizeof( type ) (1)
sizeof expression (2)
1) type 객체 표현 크기를 바이트 단위로 반환합니다.
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 )
**참고:** 요청하신 대로 HTML 태그, 속성, 태그 내의 C++ 코드는 번역하지 않고 원본을 그대로 유지했습니다. 이 목록은 C++의 char 자료형 관련 sizeof 연산자 사용 예시를 보여주고 있습니다.
(C++17부터)
  • sizeof ( char8_t )
(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부터)

키워드

sizeof

예제

예시 출력은 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 내 요소의 개수를 조회함
모든 기본 숫자 타입의 속성을 조회하기 위한 인터페이스를 제공함
(클래스 템플릿)