본문 바로가기
컴퓨터 공학/C, C++

[ C ]메모리 이해하기12_메모리 정리

by hahehohoo 2020. 7. 23.
반응형

 

C언어 문법 메모리 정리

 

참고 자료: 포프 C 언매니지드 프로그래밍 강의 241

※ 마무리 강의 241번 내용 그대로 딕테이션 했습니다. "섹션 9 레지스터, 스택&힙, 동적 메모리, 다중포인터 (강의 No. 224-240)" 에 해당하는 정리 강의이며, 저는 "메모리 이해하기" 시리즈에 그 내용을 실었습니다. 하지만 저는 강의의 모든 내용을 다루지 않았기 때문에 이번 글에는 제가 언급하지 않은 부분이 있습니다.

 

 

■ 메모리 종류

정리할께요. 여기까지가 C에서 반드시 배워야 하는 기술적 기타 등등 전부를 마무리 짓는거예요. 그 뒤에 이런거 응용해서 사용하는 법, 새로운 표준에서 몇 가지 것들을 배우긴 배울꺼에요. 여기서 배운거 가장 마지막에 메모리 관리 같은걸 남겨둔 이유는 포인터는 처음 들어가도 힘든데 곧바로 동적 할당일던가, 이중 포인터 들어가면 어려워져요. 그래서 그거에 충분히 익숙해지는 계기가 생기면 그걸로 문자열도 다뤄보고 그 다음에 배워보자는 개념이었어요.

 

그러기 위해서 긴 과정으로 메모리를 쭉배워봤어요. 스택 메모리는 확실히 배웠고, 중간에 전역 변수가 여기 들어가네 이런 이야기들 하기 시작했죠. 그러다 힙 메모리, 동적 메모리 이런게 있는게 나중에 배워요 하고 떡밥을 던졌어요. 그러다가 여기서 스택 메모리, 힙메모리 구분했고요. 추가로 레지스터 이야기 했죠. 그런데 레지스터는 CPU 내부에서 연산을 이렇게 일어난다. 그래서 레지스터는 메모리랑 확실히 다른 개념이다. 그리고C에서 레지스터를 쓸 수도 있지만 거의 무시 받는다. 그래서 register라는 키워드를 설명드리기 위해서 다룬거예요.

 

사실 메모리를 크게 두 가지로 보면 스택과 힙이죠. 이제 둘의 차이를 정리할 수 있겠죠. 스택은 미리 프로그램마다, 정확히 말하면 쓰레드마다 떼어놓은 메모리예요. 그 메모리는 자동으로 관리가 된다. 어떻게? 오프셋 개념으로 함수 호출할 때, 변수 추가로 만들 때, 그 컴파일러가 미리 코드를 만들어 놨다. 얘를 몇 바이트만큼 옮겨서 사용하고, 몇 바이트만큼 줄이고 이런식으로 알아서 미리 정해진 규칙에 따라 관리가 되게 만들어놨다. 그런데 스택은 크기에 단점이 있었다. 수명의 단점도 있었다.

 

 동적 메모리

 이거를 프로그래머가 알아서 제어하게 해줄 수 있는 부분이 동적 메모리 관리였다. 말록 칼록 리알록 등등의 함수를 썼는데 문제는 동적 메모리에 할당해오는 순간, 스택처럼 메모리 관리해주는 게 없기 때문에 프로그래머가 알아서 다 관리를 해야겠더라. 그리고 동적 메모리 가져오면 느릴 수 있더라. 누군가 관리를 해줘야 하는데 쉽지 않더라.

 

그래서 동적 메모리 정적 메모리 할 때 가능하면 정적 메모리를 쓰자. 안 되면 동적 쓰는 습관 들이자. 동적 쓰면 실수할게 너무 많다. 실수하는거 정말 다양한 예보았다. 그렇게 하지 않기 위해서 대여섯가지 원칙들을 다뤘다. 그 설명 이제 계속 기억하고 이 언어를 사용하시든 다른 언매니지든 언어를 사용하시든 계속 기억하고 사용하셔야 되요. 그리고 매니지드 언어를 사용하는 다른 분야에서도 그 매니지드 언어가 게임같이 성능을 중요시 하는 곳에서 사용을 할 경우는요. 그 매니지드 언어를 그냥 있는 그대로 사용하면 성능 저하가 엄청나요. 그래서 매니지드 상황에서도 언매니지드 언어인 것처럼 사용해야 되는 경우도 있어요. 그런거 잘 기억해두시고, 충분히 이 과목에서 습관을 들이도록 노력을 하셨으면 좋겠어요. 

 

■ 다중 포인터

뭐 이중 포인터 위주로 봤는데 포인터의 개념이 제대로 잡히셨다면 처음에 조금 힘들지만 결국에는 이해가 되실 부분이라고 봐요. 그런데 그 개념을 이해하려면 포인터에 저장되는 값은 무엇? 걔는 주소. 이렇게 기억하는게 좋을 것 같다고 말씀드렸어요. 다중 포인터를 다시 정리하고 한번에 설명하기에 어려울 것같아요. 하지만 다중 포인터를 쓰는 곳은 몇 군데 있다. 커맨드 라인에서 인자를 받아올 때 다중 포인터가 들어올 수 밖에 없고 이거는 예전에 그림까지 보여드렸다. 이차원 배열도 당연히 그렇고, 그리고 이제 저희가 봤던 sort 함수. 거기서도 그렇게 다중 포인터가 들어오기도 하더라. 그런거를 잘 생각해서 이중 포인터까지 보는건 흔하니까 절대 안 볼꺼라 생각하지 말고 복습하세요. 

 

물론 다중 포인터 특히 이중 포인터는 이제부터 배울 씨언어 사용해서 좀 이런저런 해볼껀데 첫 번째로 해볼 것은 데이터 구조. 자료 구조라고 하는 거거든요. 거기 보시면 마지막 쯤에 연결 리스트 이런게 나와요. 거기서도 이제 이중 포인터를 또 볼일이 있어요. 그래서 이중 포인터에 좀 익숙해지셔야만 이 많은 걸 할 수 있기 때문에 여기서 배운 내용 가장 중요한 내용 중 하나예요. 잘 복습하세요. 

 

 

 

 

-----------------------------------

C언어 문법 총정리

목록 보러가기 

-----------------------------------

 

 

 

 

반응형


댓글