david's daily developer note

[C,C++] memory fragmentation - struct packing 본문

[Develop] Native/C++ , C

[C,C++] memory fragmentation - struct packing

mouse-david 2018. 5. 29. 18:21
728x90

memory fragmentation - struct packing

 

메모리 단편화(memory fragmentation)에 관한 글을 일전에 작성했다.

이전 글에서 내부단편화의 문제를 간략하게 언급하였는데,

이 글에서는 내부단편화를 만드는 패딩비트에 대해서 알아보자.

우선 구조체 패킹을 이해하고자 다음의 예를 보려고 한다.

struct pack_1
{
 char c1; // 1byte
 char c2; // 1byte
};

 

struct pack_2
{
 char c1;   // 1byte
 double d1; // 8byte
};

 

두 구조체의 크기는 각 2 byte, 16 byte이다.

2번 구조체의 크기가 16 byte가 나온 이유를 간단히 설명하면,

구조체의 Primitive 멤버는 패킹 크기 내에서 자신의 크기에 배수로 정렬되기 때문이다. (char 1, short 2, int 4..)

여기서 패킹 크기는 최대 primitive 멤버 크기가 기본값인데(8), 패킹 크기를 넘어가면 배수 정렬이 무시된다.

2번 구조체의 경우에는 최초 1 byte char가 있고, 다음에 8 byte double이 나와서

double 변수를 8 byte 정렬하고자 char에 7 byte 패딩 비트를 붙여서 배수에 정렬된다.

 

 

CPU 접근 성능을 위해서 패딩 비트 메모리를 낭비한다.

모르겠고, 1 byte씩 접근해라 나의 끔찍한 메모리 아깝다고 하면 단순히 다음과 같이 명시할 수도 있겠다.

(그러나 CPU성능도 중요하다).

#pragma pack(push, 1)
#pragma pack(pop)

 

그럼 다음의 예를 보자.

struct pack_3
{
 char c1;
 double d1;
 int i1;
};

 

 

결과는 24 byte가 나온다. 구조체 2와 double 순서까지 멤버가 같은데, int추가로 4 byte가 아닌,

8 byte가 추가되었다. 뒤에 4 byte 패딩 비트는 구조체가 연속된 자료구조 형태로 적재될 때를 고려하여

붙여진 것이다. 여기서 구조체 3을 malloc하여 크기를 본다면? 당연히 24 byte로 같다.

패딩비트는 결국 CPU 성능을 위하여 추가되었고, 사용되지 않는 메모리 공간이라는 결론이다.

즉, 내부단편화의 예시이다. 이러한 부분은 개발자의 세심한 고민으로 해결가능하다

struct pack_3
{
 double d1;
 int i1;
 char c1;
};

 

 

 

padding bits

https://ko.wikipedia.org/wiki/Struct

 

#pragma pack

https://msdn.microsoft.com/ko-kr/library/2e70t5y1.aspx

 

struct packing

http://www.benjaminlog.com/entry/structure-packing

728x90

'[Develop] Native > C++ , C' 카테고리의 다른 글

[C,C++] __func__  (0) 2018.12.19
[C,C++] copy constructor  (0) 2018.06.26
[C,C++] memory fragmentation  (0) 2018.05.29
[C,C++] STL Container Reserve  (0) 2018.05.28
[C,C++] emplace_back  (0) 2018.05.28