c++의 메모리 할당방식이 궁금합니다.
글쓴이: 호기심천국 / 작성시간: 수, 2018/06/06 - 5:43오후
안녕하세요 기초가 많이 약한 c++ 초보입니다.
(편의상)char*의 realloc이나 vector의 resize를 통해 메모리를 재할당할때 궁금한점이 있어서 질문드립니다.
제 생각에는 realloc이나 resize로 char* 이나 vector의 사이즈를 확장할때 기존에 다른 변수가 사용된 메모리를 침범할 수 있을것 같은데, 이런경우는 발생하지 않나요?
예를들어 메모리주소 1이라는곳에 char* arr가 생성되어있고, 메모리주소 10이라는곳에 int x라는 것이 할당되어있을때, realloc(arr, 20)을 하면 x의 값에 영향을 미치게 될 것 같아보여서요.
그렇다고 realloc이 x가 할당된 주소 10을 피해서 1~9, 11~21을 할당하는것 처럼 보이지는 않구요. (연속성때문에..)
그러고보니 근본적으로 애초에 변수를 선언할때 어떤식으로 메모리 주소를 할당해주는지도 궁금하네요... 랜덤하게 주는건 아닐것같은데 ㅠ
궁금한게 많습니다. 고수님들 알려주세요~~!
Forums:
그 경우 realloc 은 20바이트를 연속으로
그 경우 realloc 은 20바이트를 연속으로 확보할 수 있는 다른 곳에다 공간을 확보하고, 기존에 할당되었던 공간(arr이 가리키던)에 있던 내용을 그쪽으로 복사한 후, 새 공간의 시작 주소를 반환합니다. 즉 realloc(arr, 20)의 반환값은 arr의 기존값일 수도 있고, 아닐 수도 있습니다.
그 다음 질문, "근본적으로...."는 컴파일러와 런타임 라이브러리의 영역인데, 기본적으로 지역 변수라면 컴파일 과정에서 코드에 선언된 순서대로 "이놈은 int 니까 스택포인터-4 부터 스택포인터-1까지 총 4바이트에 저장하도록 하자" "그 다음 놈은 double 인데, 좀 전에 스택포인터 - 4 까지는 썼으니 이번 건 스택포인터-12 부터 스택포인터-5까지 8바이트에 저장하도록 하자"는 식으로 기계어를 만들어나가겠죠.
malloc 같은 경우는 실행 시간에 런타임 라이브러리가 처리할 텐데, 미리 운영체제에 좀 큼지막하게 메모리를 받아둔 다음에, 그걸 쪼개어 내어주고 빈 공간을 관리하는 식으로 돌고 있을 거고요.
여기까지는 아주 개론적인 얘기고 실제로 들어가는 건 시스템 프로그래밍 많이 하시는 분들이 답변해주실 거라 믿습니다;;;; 예를 들면 이런 글이 있군요.
http://egloos.zum.com/minjang/v/1232908
좋은 하루 되세요!
댓글 달기