포인터변수의 타입정보는 어디에 저장이 되나요?
글쓴이: impactlife / 작성시간: 금, 2013/07/19 - 5:49오전
안녕하세요.
처음으로 질문올려보네요.
포인터변수는 메모리주소 + 타입정보를 가지고 있다고 배웠는데요.
포인터변수 자체가 4byte이면 메모리주소는 저장한다고 하지만 타입정보는 어디에 저장이 되는걸까요?
그리고 배열의 이름이나 일반 변수등의 이름도 따로 어딘가에 저장되어야 할것 같은데
책에는 그냥 메모리의 레이블로 붙는식으로만 설명되어 있는데 이부분은 또 어디에 저장되고 어떻게 매핑되는건가요?
Forums:
소스코드에 저장됩니다.
소스코드에 저장됩니다.
아...
그렇군요. 아항~
감사합니다. 궁금증이 풀렸어요
틀릴 수도 있지만 제가 아는 선에서 답변해드리면
틀릴 수도 있지만 제가 아는 선에서 답변해드리면
실제로 포인터 변수가 가지고 있어야 하는 정보는 4byte(32bit machine 인 경우) address 입니다.
해당 address를 가지고 double 형이라면 8바이트를, short라면 2바이트를 읽어서 값을 사용하게 되겠죠
그럼 해당 address를 reference하여 8바이트를 읽을지 2바이트를 읽을지는 어떻게 결정 할까요??
이게 질문의 요지 맞으신가요??
이는 컴파일 타임에 해결되게 됩니다. 소스코드를 컴파일 할 때는 해당 변수의 타입을 알 수 있습니다(포인터의 선언 또는 캐스팅 등을 살펴 봄으로써 알고 있겠죠? 물론 이보단 더 복잡하게 해결됩니다만)
컴파일 타임에 해당 변수의 타입을 가지고 몇 바이트를 읽을지 binary code를 생성해 내게 됩니다. 즉 binary code에는 이미 몇 바이트를 읽을지 명시가 되기 때문에 타입이 없어도 됩니다.
배열의 이름이나 변수의 이름등은 심볼 테이블이라는 것에 저장이 되게 됩니다. 컴파일 타임에서 위와 같은 작업을 하는데 심볼 테이블이 사용되고, 실제 컴파일 된 binary에 심볼 테이블이 포함 되기도 합니다(이부분은 정확히 잘 기억이 안나네요)
감사합니다.
너무나 자세하게 설명해 주셔서 정말 감사합니다.
실제로 배열이름이나 변수이름은 저장되지않습니다. 책에
실제로 배열이름이나 변수이름은 저장되지않습니다. 책에 그렇게 나온이유는 쉽게 가르킬려고 한것뿐입니다.
지금 님이 배우고있는언어는 고급언어입니다. 고급언어는 로우레벨부분을 모두 추상화시켜서 내부적인 호출규약이나 그런건 보이지않습니다.
원래 변수에 데이터를 저장할때는 다음과같이 이루어집니다.
mov [ebp-4], 10 // ex
그렇군요.
컴파일타임때 저런명령을 내릴수 있도록 제가 짠 소스가 변환된다는 말씀이시죠? 음...
댓글 달기