알고리즘 문제를 풀다가 main 함수에 int arr[5000][5000]을 선언했는데 바로 종료가 되어서... 검색해봤다.
함수 내에서 선언되어 사용되는 배열의 경우 배열 자체가 스택 영역에 생성되고, 함수가 호출될 때 마다 해당 배열을 위한 메모리를 새로 생성하고 초기화 하는 작업을 하기 때문에 배열의 크기가 큰 경우에는 다른 방법을 사용해야 한다.
함수 내에서 크기가 큰 배열을 생성하는 경우 다음과 같은 문제점을 일으킬 수 있다
- 배열을 초기화 하는 경우 함수가 호출될 때 마다 값을 채워넣어야 하기 때문에 프로그램의 수행 속도가 느려질 수 있다. 특히나 자주 호출되는 함수인 경우에는 프로그램의 속도를 치명적으로 느리게 만들 수 도 있다.
- 이론적으로 스택 -- 지역 자동변수가 저장되는 영역의 크기는 제한되지 않지만, 시스템에 따라 하드웨어적인 제한이나 스택 운영의 효율을 높이기 위해 스택의 크기를 제한하기도 한다. 그렇기 때문에 함수 내에서 선언되는 배열의 크기가 과도하게 큰 경우 스택 오버플로우 에러가 발생하고 프로그램이 강제 종료 될 수 도 있다.
- 컴파일러의 종류나 옵션에 따라서는 컴파일된 프로그램의 크기가 커질 수 도 있다.
그래서 배열의 크기가 조금이라도 크다는 느낌이 든다면 다른 메모리 영역을 사용하는 것을 고려해 볼 필요가 있다
- 전역 변수나 스태틱 변수를 사용한다.
- alloc() 계열의 함수를 이용하여 힙영역을 할당하여 사용한다.
출처 :
'Algorithm' 카테고리의 다른 글
완전탐색 (0) | 2020.01.27 |
---|---|
Prim vs Dijkstra (프림 다익스트라 비교) (4) | 2019.09.23 |
Dijkstra vs Floyd-Warshall (다익스트라 플로이드 비교) (0) | 2019.09.23 |