Go에선 새로운 객체를 생성할 때 이러한 방식으로 할당을 하여 사용하는 것을 보고 의문이 들어 찾아보았습니다.
func NewInMemoryPlayerStore() *InMemoryPlayerStore {
return &InMemoryPlayerStore{map[string]int{}}
}
C에선 함수 내 Local 변수를 리턴하여 받게되면, 스택 영역에 할당되어서 메모리 참조 이슈를 겪게되기 때문입니다.
하지만 Golang에선 Escape Analysis라는 도피 분석 기능이 있어서 문제가 없습니다.
Escape Analysis란?
컴파일 단계에서 Local 변수가 Escape하는지 텍스트(함수 밖으로 변수가 나가는지) 확인하여 Stack 영역에 할당할지 아니면 Heap 영역에 할당할지 결정하는 최적화 기법
즉, 객체의 포인터가 서브 루틴 밖으로 전파되는지 분석하는 기술이다.
때문에 Go에서 New()를 사용하여 메모리를 할당 한다고 할지라도
해당 변수가 Escape 하지 않는다면 Stack 영역에 할당됩니다.
다양한 예시가 궁금하시다면 링크를 추천드리며 말씀드린 예시 및 좋은 설명을 보실 수 있습니다~!