AA는 16바이트 BB는 20바이트가 나오게됩니다. 이거는 구조체 안에 변수의 위치 따라 달라지게 됩니다.
이럴때는 간단한 메모리맵을 그려서 확인하는것도 나쁘진 않습니다.
환경이 32비트환경입니다. 그러면 32비트 = 4바이트, 64비트 = 8바이트가 됩니다.
현재 그림은 32비트 환경의 컴퓨터입니다. 그러므로 4바이트씩 나누어 지게 되는거죠. char a,b는 1바이트입니다. 하지만 4바이트씩 나눈다고 했습니다. 일단 그림으로 봤을 때는 a,b= 2바이트 c=4바이트 d=8바이트 하지만, 4바이트씩 인식이 되므로,
a,b는 4바이트 c는 4바이트 d는 8바이트 이므로 16바이트가 됩니다.
그림을 보면 바이트 단위로 나누어져 있습니다. 8바이트 역시 4바이트씩 나누어 지지만 그 크기 자체가 8바이트 이기 때문에 4바이티 + 4바이트 = 8바이트가 되는 겁니다.
또한 BB구조체 경우에는 a = 1바이트 , b = 4바이트, c = 1바이트, d = 8바이트 입니다. 이 경우에는 출력을 할 경우에 20바이트가 되게 되는데요. 그 이유를 보면
아까 말씀 했듯이 4바이트 단위로 나누어 집니다. a는 1바이트 그럼 3바이트가 남죠 4바이트 - 1바이트 = 3바이트 이런식이니깐요. 그러면 b는 기본 4바이트 이기 때문에 채워질수가 없어서 4바이트를 따로 담습니다. 그러면 총 현재 8바이트가 되죠, 그다음 char형 c는 1바이트 지만 4바이트 기준으로 4바이트에 채워지면서 4바이트 12바이트가 됩니다. 또한 double형은 기본 8바이트죠 4바이트 형식 두번 채워지므로 총 8바이트 입니다. 4 + 4 + 4 + 8바이트 = 20 바이트가 됩니다.. 설명이 너무 난해 할수도 있는데요.. 궁금하시면 답변 따로 드리겠습니다.
배열이 또 들어가면 그 메모리형식은 또 달라지게됩니다.
이 것이 중요한 이유는 기본적으로 우리가 memcpy를 할 때 강제 사이즈를 주는 경우가 있는데 이렇게 되면 32비트 64비트 형식일때 들어가는 사이즈가 달라집니다 이점 유의하시기 바랍니다.