Go - 스택 메모리와 힙메모리
대부분 프로그래밍 언어는 메모리를 할당할 때 스택 메모리 영역 또는 힙 메모리 영역을 사용합니다.
이론상 스택 메모리 영역이 힙 메모리 영역 보다 훨씬 효율적이기 대문에 스택 메모리 영역에서 메모리를 할당하는 게 더 좋지만, 스택 메모리는 함수 내부에서만 사용 가능한 영역 입니다.
그래서 함수 외부로 공개되는 외부 메모리 공간은 힙 메모리 영역에서 할당합니다. C/C++ 언어에서는 malloc() 함수를 직접 호출해서 힙 메모리 공간을 할당합니다. 자바에서는 클래스 타입을 힙에 기본 타입을 스택에 할당합니다. Golang 은 탈출 검사 (excape analysis)를 해서 어느 메모리에 할당할지를 결정합니다.
함수 외부로 공개되는 인스턴스의 경우 함수가 종료되어도 사리지지 않습니다.
package main
import "fmt"
type user struct {
Name string
Age int
}
func NewUser(name string, age int) *user {
var u = user{name, age}
return &u // 탈출 분석으로 u 메모리가 사라지지 않음
}
func main() {
userPointer := NewUser("jongyunha", 23)
fmt.Println(userPointer)
}
NewUser() 함수에서 선언한 u 변수를 반환했습니다. 함수 내부에서 선언된 변수는 함수가 종료되면 사라집니다.
이 코드는 이미 사라진 메모리를 가르키는 댕글링 오류가 발생해야 합니다. 하지만 프로그램이 멀쩡하게 잘 동작합니다.
Golang 에서는 탈출 검사를 통해서 u 변수의 인스턴스가 함수 외부로 공개되는 것을 분석해내서 u 를 스택 메모리가 아닌 힙 메모리에서 할당하게 됩니다. 즉 go 언어는 어떤 타입이나 메모리 할당 함수에 의해서 스택 메모리를 사용할지 힙 메모리를 사용하지를 결정하는게 아닌 메모리 공간이 함수 외부로 공개되는지 여부를 자동으로 검사해서 스택 메모리에 할당할지 힙 메모리에 할당할지 결정합니다.
또한 Golang 에서는 스택 메모리는 계속 증가되는 다이나믹 메모리 풀 입니다. 일정 크기를 갖는 C/C++ 언어와 비교해 메모리 효율성이 높고 재귀 호출 때문에 스택 메모리가 고갈되는 문제도 발생하지 않습니다.
1줄 결론 Golang 짱짱
'Go' 카테고리의 다른 글
Go - 구조화된 로그 남기기 (0) | 2021.09.24 |
---|---|
Golang 으로 맛보는 TDD(테스트 주도 개발) (0) | 2021.09.15 |
Go lang 에서 Mysql 연동하기 (0) | 2021.09.10 |
구조체 슬라이스 정렬 (0) | 2021.09.07 |
번아웃 탈출을 위한 새로운 언어 Go 배워보기 (0) | 2021.09.05 |
댓글
이 글 공유하기
다른 글
-
Golang 으로 맛보는 TDD(테스트 주도 개발)
Golang 으로 맛보는 TDD(테스트 주도 개발)
2021.09.15 -
Go lang 에서 Mysql 연동하기
Go lang 에서 Mysql 연동하기
2021.09.10 -
구조체 슬라이스 정렬
구조체 슬라이스 정렬
2021.09.07 -
번아웃 탈출을 위한 새로운 언어 Go 배워보기
번아웃 탈출을 위한 새로운 언어 Go 배워보기
2021.09.05