Language/C++

[C++] 변수 크기와 sizeof() 연산

마탁이 2020. 12. 13. 16:49

1. 변수 크기와 sizeof() 연산자

  - 메모리는 일반적으로 byte 단위로 구성되며, 각 단위는 고유한 주소를 가진다.

  - 변수는 보통 메모리를 1 byte 이상 차지한다.

 

  1) 변수가 더 많은 메모리를 차지할 수록 더 많은 정보를 저장할 수 있다.

    : 각 bit는 0 또는 1의 정보만을 가지기 때문에 1 bit가 가질 수 있는 값의 경우의 수는 2개이다.

  2) 컴퓨터가 사용 가능한 메모리양은 한정되어 있으므로, 자료형에 따른 변수의 크기가 중요하다.

 

  3) sizeof()

    : 자료형 또는 변수를 가지고 크기를 byte 단위로 반환하는 연산자

 

2. C++ 기본 자료형의 크기

  - boolean (1 byte)

  - character

char 1 byte
wchar_t 1 byte
char16_t 2 byte
char32_t 4 byte

  - integer

short 2 byte
int 2 byte
long 4 byte
long long 8 byte

- floating

float 4 byte
double 8 byte
long double 8 byte

 

3. 4 byte를 1 byte 씩 읽을 수 있는가?

  - 읽을 수 있다. 메모리 상으로 4 byte의 공간을 차지하고 있을 뿐이지 주소상으로는 연속된 값.

  - java의 read()

 

4. 구조체의 크기

  - 멤버(기본 자료형) 중 가장 큰 변수의 메모리를 기준으로 잡는다.

  - RAM에 있는 데이터를 CPU의 레지스터(CPU의 메모리 공간)에 저장하며

    레지스터에서 32 bit는 4 byte를, 64 bit는 8 byte를 한 번에 읽을 수 있다.

  - 레지스터에 공간을 잡을 때, 비는 공간을 패딩 바이트(Padding Byte)라고 한다.

  - 클래스/구조체는 자신을 자신의 멤버로 가질 수 없다. (크기를 측정할 때 무한 재귀가 발생)

 

5. 클래스의 메모리 크기

  - 멤버 중 제일 큰 변수의 메모리를 기준으로 레이아웃을 잡는다.

  - 구조체와 같이 제일 큰 함수의 크기만큼 공간을 잡는다. (변수의 순서에 상관없다.)

  - 레이아웃마다 가장 큰 공간으로 잡기에 메모리 낭비가 심하고

    이를 #programa pack(1)으로 1 byte 단위로 할당할 수 있다.

  * 가상함수를 가진 클래스

   - 가상함수를 가진 클래스는 멤버 변수 이외에 가상함수리스트(vtable)를 가리키는 포인터(vfptr)를 가진다.

     (클래스 할당 시 제일 앞부분에 포인터(4 byte)로 할당)

   - vfptr은 가장 큰 메모리의 공간을 멤버 변수와 별개로 잡는다.

'Language > C++' 카테고리의 다른 글

[C++] 가상함수  (0) 2020.12.13
[C++] 선언과 정의  (0) 2020.12.13
[C++] 다양한 변수 초기화 방법  (0) 2020.12.13
[C++] Java 와 C++ 유사점 및 차이  (0) 2020.12.13
[C++] float 와 double  (0) 2020.12.13