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 |