: : C++

[Memory Structure] 변수 타입

Jay.P Morgan 2024. 6. 29. 03:38

 

  1. Fundamental Types

 

  타입 사이즈 및 메모리라고 해서 각 변수나 클래스, 혹은 포인터가 메모리 상에 어떤 크기로 allocation 되는지 알아봅시다.

 

 

  이전 글에서, 간단한 코드를 만들어서 int 3개와 double 1개를 allocation하여 각 메모리 주소를 알아보았습니다. 그리고, 더 low level로 내려가면 이러한 격자 무늬 속에서 각각의 변수가 그 사이즈에 맞는 공간을 차지하고 있다고 알아보았습니다.

  변수의 사이즈는 sizeof() 함수를 통해 확인할 수 있습니다.

 

 

  그런데 주의해야 할 점은, int는 컴파일러나 아키텍처에 따라 2byte 혹은 4byte로 적용될 수 있다는 점 입니다.

 

※ CPP Reference : Fundamental Types

 

 

 

 

  2. Variable size 확인

 

  이럴 땐 크게 두 가지 방법으로 확인할 수 있습니다.

 

  1.1  static_assert 를  통해 4byte가 맞는지 확인

※ int가 4byte가 아닐 시 static_assert가 깨져서 컴파일 에러 발생

 

 

 

  1.2  고정된 자료형을 사용 (C++11  이후부터 사용 가능)

※ CPP Reference : Fixed width integer types (since C++11)

 

※ <cstdint> 헤더파일 추가 후, int8_t : 1byte (8bit), int64_t : 8byte (64bit)임을 확인

 

 

 

  2. Array

 

  2.1  C 스타일 array

 

※ 4byte int 자료형이 10개 선언되어있으므로, 40byte가 출력됨을 확인

 

 

  2.2  C++ 스타일의 array

※ <array> 헤더파일 추가 후 std::array<int,5> b 와 같이 배열 선언 가능



 

 

 

  3. Pointer

 

※ 64bit architecture에서 Pointer는 8byte (64bit)의 크기를 갖는다.

 

 

 

  4. Object의 stack view

 

  4.1  struct

※ Struct 멤버 변수 a, b, c 크기의 합은 14byte이나, 실제로는 memory access 패턴때문에 컴파일러가 16byte를 할당한다.

 

 

  4.2  class

※ class 내에서 멤버변수만 memory를 할당하며, function은 stack에 메모리를 할당하지 않는다.

 

※ Pointer는 64bit Architecture에서는 항상 8byte의 크기를 갖는다. (대상의 자료형과는 무관함)