작성
·
159
0
구조체 설명하는 부분중 shrot나 char로 자료형을 두어도 메모리를 보면
전부 int로 바뀌어 있다는 부분을 설명하는 것에서 이해가 가지 않는 부분이 있습니다.(강의 20분 14초쯤에 있는 내용입니다)
1. 메모리에서 &변수명으로 메모리가 어떻게 할당되어 있는지 확인 할 때 &playerInfo 이렇게 하셨는데
short로 바꾼 것은 type이라는 변수입니다.
그렇다면 &playerInfo.type으로 해야 type이 메모리에 어떻게 할당되었는지 알 수 있는 것 아닌가요?
2. 왜 드래그를 4줄에 하시는지 모르겠습니다.
&playerInfo의 주소는 0x006DD484이고 메모리에서도 그 부분만 보는 것 아닌가요?
질문하다보니 생각나는 점은 메모리 표시를 1byte 정수에 열도 1열로 표현하라 해서 4줄에 하신 것 같은데
그건 short가 int가 될 것이라는 것을 알고 하신 것 같습니다. 만약 이런 사실을 모른다면 어디까지가 할당받은
메모리 공간이라고 생각해야 하나요?
답변 2
1
1.
메모리에서 &변수명으로 메모리가 어떻게 할당되어 있는지 확인 할 때 &playerInfo 이렇게 하셨는데
short로 바꾼 것은 type이라는 변수입니다.
그렇다면 &playerInfo.type으로 해야 type이 메모리에 어떻게 할당되었는지 알 수 있는 것 아닌가요?
-> &playerInfo.type으로 하나 &playerInfo 으로 하나 어차피 똑같습니다.
type은 PlayerInfo 구조체의 첫번째 요소(오프셋 +0)이기 때문이죠.
2. 왜 드래그를 4줄에 하시는지 모르겠습니다.
&playerInfo의 주소는 0x006DD484이고 메모리에서도 그 부분만 보는 것 아닌가요?
0x006DD484는 type의 시작 주소이고,
거기서 몇 바이트 짜리인지를 계산해서 데이터를 긁어와야 합니다.
type가 2바이트(short)이니 0x006DD484, 0x006DD485에 해당하는 01 00이 type 영역일 것이고,
리틀엔디안 특성상 뒤집어서 보면 0x0001이라는 숫자가 될겁니다.
반면 type이 4바이트(int)였다면 0x006DD484부터 4바이트를 긁어와서
01 00 00 00이 해당 데이터가 될 것이고,
역시나 리틀 엔디안 특성상 뒤집어서 보면 0x00000001이라는 숫자가 될겁니다.
그건 short가 int가 될 것이라는 것을 알고 하신 것 같습니다.
만약 이런 사실을 모른다면 어디까지가 할당받은 메모리 공간이라고 생각해야 하나요?
물론 전 4바이트 메모리가 할당 될거라는걸 알고 한겁니다.
이건 우연이 아니라 struct (혹은 class)를 만들 때
빠른 연산을 위해 컴파일러가 알아서 데이터를 '정렬'해줍니다.
관련하여 [C++ 구조체 패딩]을 검색해보시면 됩니다.
그런데 그와는 별개로 [short가 int가 될 것이라는] 것은 살짝 잘못된 설명인게,
short는 여전히 short가 맞습니다!
그러니 type의 영역은 2바이트가 맞지만,
다음 데이터로 넘어가기 전에 추가적으로 2바이트를 비워놓은 쪽에 가깝습니다.
이 부분은 나중에 서버 쪽에서 다시 다루게 되고
당장은 체감할 일이 없어서 굳이 언급을 안했는데,
쉽게 기억하면 [연산 속도 향상을 위해 큰 데이터를 기준으로 데이터가 정렬]되어 저장된다고 보시면 됩니다.
지금은 struct에서 가장 큰 데이터가 int이니,
4바이트를 기준으로 데이터가 정렬되어 저장되느라
short는 2바이트만 필요함에도 불구하고
4바이트를 할당해서 2바이트를 short로 사용하고,
2바이트를 비워두고 있는겁니다.
컴퓨터가 빠르게 접근하기에 이렇게 패딩을 넣어놓고 있는데
이게 네트워크 통신에서는 패킷이 늘어나는 문제를 야기해서
서버 시간에 언젠가 다시 다루게 됩니다. (컴파일러 설정을 통해 1바이트 정렬로 강제로 맞출 수도 있습니다)
0