youngerman06   8년 전

환경 : 우분투 g++ 컴파일러 ( g++을 사용하지만, 대부분의 함수나 형은 C 표준을 따라서 사용합니다.)
문제 : 코딩을 돌리는데 큰 메모리를 사용할 때 세그멘테이션 오류(core dump)가 발생합니다.

 이 때 이러한 배열을 전역변수로 선언하냐, 지역변수로 선언하냐에 따라 발생하기도 하고, 안하기도 합니다. 저는 배울 때는 전역변수에 비해 지역변수가 메모리를 효과적으로 사용하기 때문에 더 좋다고 배웟습니다.하지만, 실제로 사용을 할 때에는, 같은 메모리공간을 사용 할 때 전역으로 하면 오류 없이 돌아가고, 지역으로 하면 오류나서 돌아가질 않습니다.

왜일까요..? 제 주변사람들은 도무지 이 질문에 대해 답을 주시지 않던데...

P.S 코드의 예를 들면, 통계물리 분야에서 유명한 Newman의 percolation algorithm에서는 이 문제를 풀기 위해 전역 변수를 사용합니다. 하지만 제가 이를 지역변수로만 바꿔서 코딩을 하면,  시스템 사이즈가 클 때 에러가 납니다...ㅠ


Ref.
http://arxiv.org/pdf/cond-mat/0101295v2.pdf



ntopia   8년 전

지역변수는 스택에 메모리공간이 잡힙니다.

그런데, 리눅스의 프로세스당 기본 스택사이즈는 1MB 였나 8MB 였나 여튼 저것 밖에 안됩니다.

그러니까 지역변수에 큰 배열을 선언하면 스택이 터져서 오류가 나는 것이지요.

전역변수는 힙 공간에 잡히므로 저런 제한에서 자유롭습니다.


그런데 전역변수에 비해 지역변수가 메모리를 효과적으로 사용한다는 얘기는 처음 듣는 군요...

아마 변수 몇 개 정도 사용할 때는 아주 조금 빠를 것 같긴 한데,

그 이상의 큰 공간은 어차피 잡을 수 없으니 뭐라 판단할 수 없는 문제겠네요

youngerman06   8년 전

아 저는 전역변수는 처음부터 끝까지 공간을 차지하고 있고, 지역변수는 각 블록이 끝날 때 마다 공간을 풀어주니까 효과적이다고 배웠거든요...!

메모리는 다음과 같이 쓰인다고 알고 있었는데..!

cb92c7f69792ff7258948d4789da9a9f.jpg

그렇다면 스택은 사이즈에 제한이 있는데, 힙은 제한이 없나요?

그럼  다른 메모리 공간같은 경우는 사용공간에 제한이 있나요??

ntopia   8년 전

나머지 공간은 OS가 적당히 가변적으로 잘 해줄것 같네요.

이론적으로는 주소공간이 정해져있으니까 이론적인 메모리 한계도 주소공간의 전체 크기가 되겠지만

실제로는 물리메모리의 한계가 있으니까 뭐 적당히 그 쯤 되겠죠

여튼 Problem Solving 쪽 공부하실 때는 배열이 스택에 잡히지만 않게 하면 별 문제 없을 겁니다.

youngerman06   8년 전

감사합니다!! :)

덕분에 많은 도움이 되었습니다!

kyma123   8년 전

@ntopia

경험상 전역변수/지역변수의 실행시간 차이가 있긴 있더라고요 

https://www.acmicpc.net/board/view/2307

댓글을 작성하려면 로그인해야 합니다.