지역변수는 스택에 메모리공간이 잡힙니다.
그런데, 리눅스의 프로세스당 기본 스택사이즈는 1MB 였나 8MB 였나 여튼 저것 밖에 안됩니다.
그러니까 지역변수에 큰 배열을 선언하면 스택이 터져서 오류가 나는 것이지요.
전역변수는 힙 공간에 잡히므로 저런 제한에서 자유롭습니다.
그런데 전역변수에 비해 지역변수가 메모리를 효과적으로 사용한다는 얘기는 처음 듣는 군요...
아마 변수 몇 개 정도 사용할 때는 아주 조금 빠를 것 같긴 한데,
그 이상의 큰 공간은 어차피 잡을 수 없으니 뭐라 판단할 수 없는 문제겠네요
youngerman06 8년 전
환경 : 우분투 g++ 컴파일러 ( g++을 사용하지만, 대부분의 함수나 형은 C 표준을 따라서 사용합니다.)
문제 : 코딩을 돌리는데 큰 메모리를 사용할 때 세그멘테이션 오류(core dump)가 발생합니다.
이 때 이러한 배열을 전역변수로 선언하냐, 지역변수로 선언하냐에 따라 발생하기도 하고, 안하기도 합니다. 저는 배울 때는 전역변수에 비해 지역변수가 메모리를 효과적으로 사용하기 때문에 더 좋다고 배웟습니다.하지만, 실제로 사용을 할 때에는, 같은 메모리공간을 사용 할 때 전역으로 하면 오류 없이 돌아가고, 지역으로 하면 오류나서 돌아가질 않습니다.
왜일까요..? 제 주변사람들은 도무지 이 질문에 대해 답을 주시지 않던데...
P.S 코드의 예를 들면, 통계물리 분야에서 유명한 Newman의 percolation algorithm에서는 이 문제를 풀기 위해 전역 변수를 사용합니다. 하지만 제가 이를 지역변수로만 바꿔서 코딩을 하면, 시스템 사이즈가 클 때 에러가 납니다...ㅠ
Ref.
http://arxiv.org/pdf/cond-mat/0101295v2.pdf