해결된 질문
23.10.20 16:52 작성
·
190
1
변수의 메모리 할당은 언제 이루어지는 건가요?
변수를 선언하면 쓰레기값으로 초기화되는 건가요? 이 경우 선언 즉시 메모리가 할당되는 게 맞는지도 궁금합니다.
혹은 사용자가 선언 및 초기화 시에 메모리 할당이 이루어지는 걸까요?
혹은 해당 변수에 무언가 대입되어야 메모리 할당이 이루어지는 건가요?
답변 2
1
2023. 10. 23. 12:57
수박님께서 7.10 강의 안내를 잘 해주셨는데,
스택 메모리는 프로그램이 실행될 때 미리 잡아놓고 프로그램이 끝날때까지 계속 사용합니다.
(힙 메모리는 동적으로 사용)
스택을 사용하는 지역 변수는 그때그때 메모리 자체를 운영체제에게 동적으로 받아오는 것은 아닙니다. 이미 가지고 있는 스택 메모리에서 특정 공간을 그 변수 이름으로 사용할 수 있게 해주는 것입니다. 모든 변수에 대한 메모리를 그때그때 동적할당으로 받아오면 너무 느리기 때문에 시작할때 어느정도 메모리를 미리 잡아놓고 시작합니다. 반대로 아마 들어보셨을텐데 스택오버플로우 같은 경우는 미리 잡아 놓은 메모리보다 더 많은 메모리를 사용하는 경우(예: 무한 재귀 호출)에 발생하는 문제입니다.
함수의 영역을 벗어나면 지역 변수의 이름을 사용할 수 없게 되는 것이지 그 변수가 사용하던 스택 메모리 자체가 해제(deallocate, 운영체제에게 돌려주는 것)되는 것은 아닙니다.
함수 영역으로 들어왔을때 지역 변수가 특정 메모리를 사용할 수 있게 "할당" 해주는 것은 의미상으로는 맞습니다만 그때그때 동적 할당을 받는 것은 아니고 이미 프로그램이 가지고 있는 메모리에서 받아오는 것이기 때문에 빠릅니다. (동적 할당은 운영체제가 어느 메모리를 줄 지 찾아서 줘야 하기 때문에 느리지요.)
이 강의는 C++ 문법 자체도 다룰 내용이 많다 보니 메모리 관련된 내용들은 C언어 강의에서 더 자세하게 다루었습니다.
아래 웹 가시화 도구에서 간단한 프로그램을 실행해보시면 스택 메모리가 어떻게 사용되는지 확인하기 편합니다.
https://pythontutor.com/cpp.html#mode=edit
0
안녕하세요, 답변 도우미 Soobak 입니다.
변수의 유형과 선언 방식에 따라서 달라진다고 답변드리는 것이 적절한 것 같습니다.
지역 변수 (Local Variables)
: 선언된 함수가 호출될 때 스택
이라고 불리는 메모리 영역에 할당되고, 함수가 종료될 때 해제됩니다.
(수정) 위 교수님의 답변을 참고해주시면 감사하겠습니다. 잘못된 답변으로 혼동을 드려 죄송합니다.
전역 변수 (Global Variables)
: 프로그램이 시작될 때 데이터 세그먼트
라고 불리는 메모리 영역에 할당되고, 프로그램이 종료될 때 까지 유지됩니다.
정적 변수 (Static Variables)
: 지역 변수로 선언될 경우 해당 함수가 호출될 때 한 번만 초기화되며, 함수가 종료되더라도 메모리에서 해제되지 않습니다.
동적 메모리 할당 (Dynamic Memory Allocation)
: new
키워드를 통해 힙
이라고 불리는 메모리 영역에 할당되고, delete
키워드를 통해 할당이 해제됩니다.
보다 자세한 내용은 강의 전반에 걸쳐서 자세하게 학습하시게 됩니다.
또한, 강의 7.10 스택과 힙 the stack and the heap 에서 메모리 영역에 대해 교수님께서 자세히 설명해주시니, 해당 강의만 잠시 참고해보시는 것도 추천드립니다.