inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

class와 메모리

해결된 질문

337

작성자 없음

작성한 질문수 0

0

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

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


-본론-

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

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

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

바로 Code영역인데요

 

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

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

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

 

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

Code영역은 무한인가요??

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

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

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

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

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

c++

답변 1

3

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 단위인 것은 아트 리소스 파일 때문이지, 실행파일이 아닙니다!)
아트 리소스에 비해 사실 코드는 아주 귀엽고 하찮은 용량을 차지해서
상상하시는 것처럼 코드가 너무 방대해서 코드 영역이 찰 일은
들어본 적도 없고 걱정할 필요도 없습니다.

문제집은 없나요 수업을 어떻게 들어야 할지 모르겠어요

0

117

2

동적배열 Vector의 push_back 함수에서 조건문 질문

0

77

1

디버깅할때 메모리보는법 단축키가 뭐죠??

0

94

1

113-충돌처리 강의에서 22:26 부근의 SetPos()를 적용해도 충돌되지 않고 뚫고 지나가게 됩니다.

0

90

1

SaveFile에서 크래시 발생하는 분들 체크해보세요

1

70

1

수업자료 확인 부탁드립니다.

0

106

3

explicit을 붙였을 때 빨간줄이 뜨는 이유가 맞는지 궁금합니다.

0

101

0

22강에서 구조체와 포인터로 설명해주셨는데 패딩의 경우는 어떻게 되나요?

0

89

2

리소스 매니저 강의 18분 부근

0

89

1

[Service강의] owner -> shared_ptr

0

80

2

C#에서 생성자 관련 질문

0

85

2

특정 조건에서만 함수를 반환할 때

0

91

2

스택 empty

0

105

2

섹션4 배열실습 질문입니다.

0

133

1

섹션3 '파일분할' 강의 질문입니다.

0

99

1

Defines.h의 DECLARE_SINGLE관련 질문입니다.

0

112

1

세션8 우선순위 큐 pop함수의 Predicate 적용 관련 질문이 있습니다.

0

184

3

섹션9 함수 포인터 관련 질문입니다.

0

137

1

exercise_A 번 문제 해결방법에 대한 질문.

0

152

1

[강의명: virtual 소멸자] 자식 클래스의 소멸자에도 virtual 을 붙이시는 이유가 궁금합니다

0

200

2

Scene과 SceneManager 강의 수강 중 키보드 입력 오류

0

151

1

Window API 강의 수강 중 LARGE_INTEGER 타입 변환 오류

0

199

3

섹션15 스마트 포인터 20:00 질문이요!

0

129

1

55강 수업자료 빌드를 하면 이상합니다.

0

133

1