C#의 메모리 구조는 무엇이며 어떤 차이가 있는지 비교해서 설명해주세요.
C#의 메모리 구조 영역으로는 코드, 데이터, 힙, 스택 영역이 있습니다.
코드 영역은 프로그램의 실행 코드가 저장되는 공간입니다.
데이터 영역은 정적 변수와 상수, 문자열들이 저장되는 공간입니다. 정적 변수는 프로그램이 시작될 때 메모리에 할당되며, 프로그램이 종료될 때까지 유지됩니다.
힙 영역은 사용자 관리 영역으로 사용자 정의에 의해 할당된 메모리에 저장하거나 해제하는 동적 할당을 사용합니다. 참조 형식의 데이터가 이 곳에 저장되며 가비지 콜렉터가 주기적으로 관리합니다.
스택 영역은 지역 변수, 매개 변수들이 저장되며 컴파일 시점에 크기를 할당하는 정적 할당을 사용합니다. 값 형식에 데이터가 이 곳에 저장되며 코드 블록이 끝나면 자동으로 메모리에서 해제됩니다.
C# 프로그램은 MSIL (Microsoft Intermediate Language) 또는 CIL (Common Intermediate Language) 이라고 하는 중간 언어로 컴파일 되며, 이 MSIL 코드가 코드 영역에 저장된다.
실행시 CLR (Common Lanaguage Runtime) 에 의해 MSIL 코드가 실제 기계 코드로 변환되고 실행된다.
할당된 스택 내에 stack frame이 쌓이게 되는데, 과도한 재귀 또는 너무 큰 지역 변수를 선언하게 되면 stack 영역의 크기를 초과하게 되면서 다른 메모리 영역을 침범하는 현상
stack frame : 함수의 매개 변수, 반환 주소 값, 함수 내부의 지역 변수 등 함수의 호출 정보
=====================================================