iOS 메모리 - 스택 영역이 컴파일 타임에 결정된다

0

스택 영역이 컴파일 타임에 결정된다는게

도대체 무슨 말일까요?
많은 블로그에서 말하고 있습니다.
스택 영역의 크기가 컴파일 타임에 결정된다고
그런데 이상합니다. 우리는 "런타임"에 객체를 생성하고 있어요!
분명 우리는 "런타임"에 struct를 생성하고 있잖아요! 분명 스택에 가변적으로 메모리를 할당하고 있지 않나요?
우리가 struct를 여러개 생성할 수 있잖아요? 이걸 컴파일 타임에 몇 개나 생성될지 어떻게 알고 미리 메모리를 정할 수 있죠?


오해의 시작

iOS에서 스택(Stack) 영역에 "컴파일 타임에 크기가 결정된다"는 말의 뜻은 스택 영역에 할당되는 메모리의 크기가 프로그램이 실행되기 전에 고정된다에서 출발했을 겁니다.
그런데, 이 말의 뜻은 스택 영역이 아주 고정돼서 더 이상 새로운 것이 할당되지 않는다는 뜻이 아니라
지역 변수, 함수 매개변수, 함수 호출 정보(리턴 구조) 등의 크기가 미리 결정된다는 것을 의미합니다.


그렇다면 struct를 생성한다는 것은

스택의 특성과 메모리 할당 방식에 대한 혼동을 이해해야 합니다.
struct 하나의 크기는 컴파일 타임에 결정됩니다.
그러나 스택에서 struct를 할당하는것은 런타임에 결정됩니다.
즉, 할당되는 메모리의 크기는 컴파일 타임에 결정되지만, 할당 자체는 런타임에 이루어집니다.
스택은 컴파일 타임에 딱 정해져서 변경이 없는게 아니고, struct를 생성한다는 것은 런타임에 이루어지는 행위입니다.


스택은 컴파일 타임에 결정되는게 아니다

스택 영역의 크기는 컴파일 타임에 결정된다 -> 오해가 많이 발생할 수 있는 표현입니다.
스택 영역에 할당되는 객체의 크기, 지역 변수, 매개 변수, 함수 호출 정보 등이 컴파일 타임에 결정됩니다.
실제 메모리 할당은 런타임에 진행됩니다.
그러니까, struct를 여러개 생성하는 미래를 컴퓨터가 예측해서 미리 할당해 두는게 아니니까 스택이 컴파일 타임에 결정된다는 오해를 만드는 표현을 좀 더 개선하면 좋지 않을까 싶네요...


참고로...

iOS 스택 영역이 크기는 대략 1MB인 것으로 파악하고 있습니다.
(MacOS의 경우 8MB)
때문에 스택 영역에 너무 많은 것을 할당하게 되면 stack overflow가 발생하게 되죠.
우리가 힙 영역을 사용하는 이유가 이것에 있기도 합니다.
동적 메모리 할당(힙)을 적극적으로 활용해야 합니다.

profile
https://github.com/sustainable-git

0개의 댓글

관련 채용 정보