진실은 의외로 간단하지요.
그것은 구조체가 메모리에 할당 되는방식에서 기인되는데...

컴파일러는 구조체 멤버들을 일정한 기준으로 묵습니다
말이 어려운데 예를 들어보면

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바이트인지....)

다시 연구할 문제 겠군요...
다들 아시는거라면 삽질이겠지만 치매방지 차원에서 -_-;
많은 리플 부탁해요....(__)