공부/CS

정적 메모리 할당이란?

셩잇님 2023. 6. 10. 18:11
반응형

 

 

1. 정적 메모리 할당이란?

정적 메모리 할당은 일반적으로 프로그램 실행이 시작되기 전인 프로그램 컴파일 단계에서 변수 및 데이터 구조에 대한 메모리를 할당하는 것을 말합니다. 정적 메모리 할당에서는 변수에 대한 메모리 크기와 위치가 컴파일 시 결정되며 프로그램 실행 내내 고정된 상태로 유지됩니다. 즉, 컴파일 시 메모리의 크기와 위치를 알 수 있으며 프로그램 실행 중에 메모리를 변경할 수 없습니다. 예를 들어 전역 변수와 정적 변수는 일반적으로 정적 메모리를 사용하여 할당됩니다.

 

2. 정적 메모리 할당의 특징
컴파일 시 메모리 할당: 정적으로 할당된 프로그램에서 메모리는 컴파일 프로세스 중에 변수 및 데이터 구조를 위해 예약됩니다. 컴파일러는 프로그램에 정의된 변수 유형과 크기에 따라 메모리 요구 사항을 결정합니다.

메모리 위치: 정적 변수에 할당된 메모리는 일반적으로 데이터 세그먼트 또는 전역 메모리로 알려진 고정 메모리 영역에 위치합니다. 이 메모리 영역은 프로그램이 메모리에 로드될 때 할당되며 프로그램 실행 내내 일정하게 유지됩니다.

수명: 정적 변수의 수명은 프로그램 실행 기간 전체에 걸쳐 있습니다. 정적 변수는 프로그램 시작 시 한 번 초기화되며 프로그램이 종료될 때까지 해당 값을 유지합니다.

범위: 정적 변수의 범위는 변수를 선언하는 방법과 위치에 따라 달라질 수 있습니다. 함수 외부에서 선언된 전역 변수는 전역 범위를 가지며 프로그램의 모든 부분에서 액세스할 수 있습니다. 함수 내에서 선언된 정적 변수는 로컬 범위를 갖지만 함수 호출 전반에 걸쳐 해당 값을 유지합니다.

기본 초기화: 정적 변수는 명시적인 초기화가 제공되지 않는 경우 일반적으로 기본값으로 초기화됩니다. 정적 저장 기간이 있는 변수의 경우 명시적인 초기화가 지정되지 않으면 자동으로 0으로 초기화되도록 C 및 C++ 표준에서 지정하고 있습니다.

메모리 사용량: 정적 메모리 할당은 변수의 활성 사용 여부와 관계없이 변수를 위한 메모리를 미리 확보합니다. 따라서 특정 변수에 자주 액세스하지 않거나 필요하지 않더라도 프로그램 실행 내내 메모리 사용량이 고정될 수 있습니다.

스택 대 힙: 정적 메모리 할당은 런타임에 명시적으로 메모리를 할당하고 할당 해제하는 동적 메모리 할당과 구별됩니다. 정적 메모리 할당은 로컬 변수 및 동적 메모리 할당에 일반적으로 사용되는 스택 및 힙 메모리 영역과는 별개입니다.

제한 사항: 정적 메모리 할당에는 몇 가지 제한 사항이 있습니다. 컴파일 시 할당된 고정 메모리 크기는 데이터 구조와 변수의 최대 크기에 제약을 가할 수 있습니다. 또한 동적으로 변경되는 메모리 요구 사항이나 대량의 데이터는 동적 메모리 할당이 더 적합할 수 있습니다.

 

3. 정적 메모리 할당의 장점

1. 동적 메모리 할당의 오버헤드를 피하여 성능을 향상시킬 수 있습니다.

2. 변수와 객체의 수명을 더 쉽게 추적할 수 있어 코드 가독성과 유지보수성을 향상시킬 수 있습니다.

3. 메모리 누수를 방지하여 메모리 사용량을 개선할 수 있습니다.

 

4. 정적 메모리 할당의 단점

1. 프로그램의 유연성을 제한할 수 있습니다. 예를 들어, 정적 메모리를 사용하여 변수를 할당하면 프로그램 실행 중에 변수의 크기를 조정하거나 삭제할 수 없습니다.

2. 프로그램 바이너리의 크기가 커질 수 있습니다.

3. 프로그램 디버깅이 더 어려워질 수 있습니다.


5. 결론
정적 메모리 할당은 메모리를 미리 예약하고 알 수 있기 때문에 메모리 관리 및 액세스 속도 측면에서 효율적입니다. 하지만 동적 메모리 할당에 비해 유연성이 부족하고 메모리 요구 사항이 동적으로 변경되거나 대량의 메모리가 필요한 상황에는 적합하지 않을 수 있습니다. 따라서 정적 메모리 할당의 한계를 인식하는 것이 중요합니다.

 

 

 

반응형

'공부 > CS' 카테고리의 다른 글

부동 소수점 에러란?  (0) 2023.06.12
동적 메모리 할당이란?  (0) 2023.06.11
아스키 코드(ASCII)란?  (0) 2023.06.05
유니코드(Unicode)란?  (0) 2023.06.05
스택(Stack)영역과 힙(Heap)영역의 차이점은?  (2) 2023.03.28