진실은 의외로 간단하지요.
그것은 구조체가 메모리에 할당 되는방식에서 기인되는데...
컴파일러는 구조체 멤버들을 일정한 기준으로 묵습니다
말이 어려운데 예를 들어보면
struct dog
{
int i; double d; int j;
};
가 실제 메모리에 있는 모습을 보면
VC++에서는 8바이트(일정한 기준)를 기준으로 구조체 멤버를 넣습니다
여기서는
일단 첫번째 8바이트에 int i;를 넣습니다.이러면 4바이트가 비지만 무시하고
(이런 나머지 빈공간을 패딩비트라고 합니다 )
다시 두번째 8바이트를 할당하고 double d;를 넣습니다
그리고 마지막으로 다시 8바이트를 할당하고 int j;를 넣습니다...
여기 역시 4바이트가 비지만 이렇게 총 24바이트를 할당합니다...
다른 예를 들어보면
struct cat
{
int i; char c; double d;
}
실제 메모리구조는: [ int i + char c 1+ 패딩3바이트 ] + [ double d ] = 16바이트! // [ ]는 팩킹횟수
위에서 알수있듯 만약 패딩비트에 다음 멤버가 들어갈 수 있을정도로 공간이 남을경우 계속해서 집어넣고 그렇지 못할경우만 새로운 메모리를 할당합니다
그리고 이렇게 멤버들을 일정한크기로 묶을때 그 크기를 조절할 수 있습니다(패킹한다고들 하죠)
#pragma pack(push, id_dog, 4) // 팩킹시작,구별아이디, 팩킹크기(2의n승 단위)
struct dog
{
int i; double d; int j;
};
#pragma pack(pop, id_dog) //기본 팩킹사이즈로 환원
// 간단하게 #pragma pack(4)....... #pragma pack() 할 수도 있습니다.
이렇게 하고 구조체 크기를 보면 보통 생각하는데로 16바이트가 나오는것을 알수 있습니다...
근데 왜 이런 방식으로 메모리를 할당할까요?
패딩 비트를 넣어가며 공간 낭비를 할 필요가 있을까요?
(또한 왜 기본팩킹사이즈가 8바이트인지....)
다시 연구할 문제 겠군요...
다들 아시는거라면 삽질이겠지만 치매방지 차원에서 -_-;
많은 리플 부탁해요....(__)
그 구조체 안에서 가장 큰 멤버의 사이즈에 따라가는거 같습니다.
int a; char b; -> 8byte
int a; double b -> 16byte
double a; char b; -> 16byte
이유는 여전히 모르겠는데요,
언어에서 대략 메모리를 낭비하는 경우는 보통은 속도향상인 듯 해서 그쪽 이유가 아닌가 생각중입니다.