Serach

2013년 10월 10일 목요일

구조체 패딩

최대 변수형의 크기 <= n바이트 정렬의 경우
- 구조체의 앞에서부터 자기의 변수 크기에 알맞은 주소로 가도록 패딩된다.
- 가장 마지막에는 최대 변수형의 크기에 해당하는만큼 패딩된다.

최대 변수형의 크기 > n바이트의 정렬의 경우
- 자기의 변수 크기에 알맞은 주소가 되는 것이 아니라 n바이트 단위의 경계를 우선하여 정렬
- 가장 마지막에도 n바이트 크기에 해당하는만큼으로 패딩




A 구조체는  char 1바이트*4 , int 4바이트로 총 8바이트
B 구조체는  char 1바이트*2,  int 4바이트로 총 6바이트이다.


그러나 메모리에 구조체를 이대로 적재시키면 CPU가 읽어오기 부담스러워진다.

32bit CPU는 32bit 단위로 값을 읽어오고 64bit CPU는 64bit 단위로 값을 읽어온다.

구조체 A는 4byte 단위로 딱딱 구분되는 반면에 구조체 B는 구분이 명확하지가 않다.

그렇기때문에 CPU가 메모리에 여러 번 들락날락하는 일이 생기고 이는 성능 저하로 이어진다.

이 문제를 해결하기 위해 컴파일러는 패딩 비트로 빈 공간을 채움으로 단위를 맞춰준다.

패딩 비트는 성능 저하를 해결하기 위한 대안이었지만 

결국 프로그래머가 의도치 않은 부분으로 분명히 다른 부분에서 문제를 야기한다.



구조체 A와 B는 자료형, 변수명 모든 게 똑같지만 단지 선언된 순서가 다르다.

그런데 패딩 비트때문에 사이즈가 4byte나 차이난다.

실제로 구조체를 만들다보면 내가 원하는 데이터의 순서대로 번호 붙여가며 선언을 종종한다.

하지만 보이지 않는 곳에서 이런 메모리 낭비가 일어나고 있다.

지금처럼 메모리가 넘치는 세상에서 완전 큰 문제는 아니지만..

정말 고수가 되려면 이런 세심한 부분도 신경써야하지 않을까 ?!




패딩은 1,2,4,8,16 바이트까지 가능하다.

다음 사진은 VC++에서 사용가능한 패딩 옵션이다

설정에서 /Zp 옵션을 주거나

소스코드에 #pragma pack 으로도 설정 가능하다
 

댓글 없음:

댓글 쓰기