반응형

MSDN에 보면

[메모리 영역을 정확하게 제어하거나 특정 함수가 매개 변수를 수신하는 방법을 제어]

라고 나와있다.


여기서 중요한건 '정확' 이 제일 중요하다고 본다.


사용자가 정의한 클래스 혹은 구조체의 바이트패딩(Byte Padding)과 연관되어 있는데

CPU 접근에 부하를 덜어준다고 생각하면 된다.


Padding은 널리 알고있는 패딩(옷)인데 연관지어 생각하면 편하다 좀 푹신한 솜?으로 생각했다.



어쩃든,


char와 int형 변수가 있는 클래스(구조체)라고 생각해보면


이때의 사이즈는


8Byte가 나온다.


1칸당 1Byte라고 한다


1Byte

 1Byte

 1Byte

 1Byte

 1Byte

 1Byte

 1Byte

 1Byte



struct S

{

char c;

int i;

double d;

};


라고한다면


먼저 char (1byte) 가 1칸을 차지한다.


CHAR

 1Byte

 1Byte

 1Byte

 1Byte

 1Byte

 1Byte

 1Byte



그럼 그 다음부터 int (4byte)가 들어가야되는데


CHAR

 int

 int

int

 1Byte

 1Byte

 1Byte

 1Byte



로 들어가지 않고


CHAR

 empty

 empty

empty

 INT

 INT

INT

 INT


로 들어가게된다.


왜 그럴까?


CPU에서 메모리 접근시에 32비트 단위 혹은 64비트 단위로 주소에 접근할 때

발생하는 문제라고 정리할 수 있다.


32비트라고 한다면 4byte씩 접근하게 되는데


CHAR부터 시작해서 4바이트를 계산하면 빈 공간이 발생할 수 밖에 없다.


4Byte씩 접근을 해야되니까. 그래서 4Byte 후 INT가 나타났다.


그 다음 double형이라고 한다면


CHAR

 empty

 empty

empty

 INT

 INT

INT

 INT



DOUBLE

DOUBLE

 DOUBLE

DOUBLE

 DOUBLE

 DOUBLE

DOUBLE

 DOUBLE


이렇게 할당될 것이고 size는 16이 된다.


그렇다면


struct S

{

char c;

double d;

int i;

};


double과 int의 순서를 바꾸면 어떻게 될까?


CHAR

 empty

 empty

empty

 empty

 empty

empty

 empty



DOUBLE

DOUBLE

 DOUBLE

DOUBLE

 DOUBLE

 DOUBLE

DOUBLE

 DOUBLE


INT

 INT

 INT

INT

 empty

 empty

empty

 empty



이렇게 되서 총 24바이트가 된다.


[참고]

http://supercoding.tistory.com/37

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




반응형

'프로그래밍 > C, C++' 카테고리의 다른 글

[C++] 데이터 자료형 정리 와 WORD, DWORD  (0) 2022.06.14
파일 입출력.(fseek, ftell, fwrite, fread)  (0) 2017.09.29
malloc과 new의 차이.  (0) 2017.09.07
2차원 배열 포인터  (0) 2017.09.07
#pragma pack -2  (0) 2017.09.07

+ Recent posts