300x250
반응형

C언어가 아니여도 되고 그냥 기초 다지기 입니다.

 

실행환경은 리눅스입니다.

위에 그림을 보면 구조 AA, BB가 있는데 엇뜻 보면 두개 다 같을 것입니다.

하지만 각각 결과는 다르죠

밑에 그림을 보시면 결과가 다를 겁니다.

 

 

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비트 형식일때 들어가는 사이즈가 달라집니다 이점 유의하시기 바랍니다.

 

 

-------------------------------------------------------------------------------------------

그리고 AA구조체에 배열을 추가 해서 할경우에는 

 

AA구조체는 20바이트가 됩니다. 물론 4바이트 니깐 16바이트에서 20바이트가 되는거겠죠?

하지만. 그림을 그려보면

[a,b0,b1,b2][b3,x,x,x][c,c,c,c][d,d,d,d][d,d,d,d] = 20byte 이런식으로됩니다.

그전에 배열이 빠졌을 경우에는?

[a,b,x,x][c,c,c,c][d,d,d,d][d,d,d,d] = 16byte가 되는겁니다. 내부구조를 알면 더 손쉽게 이해하기가 쉽니다. 

 

728x90

+ Recent posts