인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

leegj420님의 프로필 이미지
leegj420

작성한 질문수

[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버

class와 메모리

해결된 질문

작성

·

303

·

수정됨

0

우선 강사님 덕분에 메모리를 제대로 배우고 있습니다 항상 감사할 따름입니다

강사님만큼 메모리를 정확하고 이해하기 쉽게 설명하시는 분은 없는거 같습니다 다시한번 감사합니다


-본론-

메모리는 Code, Data, Heap, Stack 영역으로 나누어 진다고 배웠습니다

강의중 드디어 class가 나왔는데

class와 메모리에 대해 너무 이해안가는 부분이 하나 있어서 이렇게 질문드리게 되었습니다

바로 Code영역인데요

 

class가 호출되기 전에는 Code영역에 있다가

호출되고 난 후에도 멤버함수는 Code영역에, 멤버변수는 Stack영역을 차지한다고 배웠습니다

(제가 여기까지는 잘 이해했나 모르겠네요..)

 

그렇다면 여기서 한가지 드는 의문이 바로

Code영역은 무한인가요??

만약에 정말 말도 안될만큼의 엄~~~~~~~청나게 많은 함수들을 class안에 작성했다고 가정했다고하면

Code영역에도 한계가 있어야되는거 아닌가요

아무리 찾아봐도 그저 "Code영역은 충분합니다" 라는 얼렁뚱땅한 답변만 있을뿐(강사님 말고 다른사람들)

아무도 "왜 충분한가"를 정확히 알려주는 곳이 없네요..

이 의문이 너무 해결이 안됩니다 ㅠㅠ 꼭 알려주셨으면 좋겠습니다

답변 1

3

Rookiss님의 프로필 이미지
Rookiss
지식공유자

class가 호출되기 전에는 Code영역에 있다가
-> ?! 그렇지 않습니다.


호출되고 난 후에도 멤버함수는 Code영역에,
멤버변수는 Stack영역을 차지한다고 배웠습니다
-> 이 또한 그렇지 않습니다.

class는 기본적으로 메모리를 차지 하지 않는 하나의 설계도입니다.
class 내부를 보면 데이터(=멤버변수)와 로직(함수)로 이루어져 있는데,
이 데이터가 생성 위치에 따라 Heap/Stack으로 올라가게 되며,
로직은 무!조!건! Code 영역에 박혀 있습니다.

딱히 종교인은 아니지만 비유하자면 돌에 박힌 10계명은
사람이 어떻게 살아야 하는지에 대한 내용을 담고 있죠?
어떤 함수에서 실행되는 '코드' 또한 컴퓨터가 실행해야 하는 행동을 담고 있으며
(if else 구문이라거나, a = 3 같은 대입이라거나...)
이 행동들은 다 10계명처럼 이미 코드 영역에 박혀 있는 상태이고
추후 프로그램 실행해도 절대 변하지 않습니다.
따라서 Class의 실행코드가 Code영역에 있다 < 로 표현하면 맞겠네요.

class는 설계도이고, 함수 내부에
Knight k; 같은 형태로 만들면 이는 지역 변수가 되며
멤버 변수 또한 Stack 영역에 올라가게 됩니다.
반면 Knight* k = new Knight();와 같은 형태로 만들면,
멤버 변수 자체는 Heap 영역에 올라가게 되고
Stack 영역에는 그 주소를 가리키는 포인터 변수 (k)가 생겨서 관리됩니다.

만약에 정말 말도 안될만큼의 엄~~~~~~~청나게 많은 함수들을 class안에 작성했다고 가정했다고하면
Code영역에도 한계가 있어야되는거 아닌가요

지구 인구가 60억명이라고 10계명을 60억번 고쳐 쓰지 않듯
Code 영역에 들어간 코드는 딱 한 번만 기계어로 변환되어 적혀 있으면 그만이고,
추후 객체가 늘어나도 코드 영역이 늘어나진 않고

동일한 Code 영역을 참고해서 CPU가 코드를 실행하게 됩니다.
그런데 만약 함수가 너무너무너무너무너무너무너무너무너무너무 많아
Code 영역에 초과되는 수준이라면? 당연히 그럼 코드가 만들어질 수 없겠죠.
하지만 꽤 큰 MMORPG 프로젝트라도 50~100만줄 단위의 코드면 만들어지는데
이는 빌드되어도 실행파일이 5MB조차 되지 않습니다.
(게임이 최종적으로 몇 GB, TB 단위인 것은 아트 리소스 파일 때문이지, 실행파일이 아닙니다!)
아트 리소스에 비해 사실 코드는 아주 귀엽고 하찮은 용량을 차지해서
상상하시는 것처럼 코드가 너무 방대해서 코드 영역이 찰 일은
들어본 적도 없고 걱정할 필요도 없습니다.

leegj420님의 프로필 이미지
leegj420

작성한 질문수

질문하기