Golang이 변수를 처리하는 방법과 이스케이프 분석이 무엇인지 알아보겠습니다. Golang에는 Go 런타임 환경에서 사용되는 스택과 힙이라는 두 가지 유형의 메모리 할당 데이터 유형이 있습니다.
스택은 작업 수행(입력 및 출력)이 더 빠릅니다. 함수 내에서 액세스되는 변수는 이 스택으로 이동합니다. 예:
package main import "fmt" func stackExample() int { a := 10 // Variable `a` is allocated on the stack b := 20 // Variable `b` is allocated on the stack result := a + b // `result` is also allocated on the stack return result // All stack variables are popped off when the function exits } func main() { result := stackExample() // Function call happens, variables are pushed to the stack fmt.Println(result) // Print the result }
GoLang에서 스택이 작동하는 방식은 다음과 같습니다. 다음은 힙입니다. 이것은 동적 메모리입니다. 즉, 요구 사항에 따라 크기를 조정할 수 있습니다. 다음은 힙 할당의 간단한 예입니다.
package main import "fmt" func heapExample() *int { num := 42 // Variable `num` is created inside the function return &num // Returning the address of `num`, which escapes the function } func main() { ptr := heapExample() // The value pointed to by `ptr` is allocated on the heap fmt.Println(*ptr) // Accessing the heap-allocated variable through the pointer }
여기서 함수는 num에 대한 포인터를 반환하므로 Go 런타임은 num이 함수 범위 외부에서 액세스된다는 것을 감지합니다. 결과적으로 스택이 아닌 힙에 num을 할당하게 됩니다.
힙은 함수나 고루틴의 범위를 벗어나는 변수를 저장하는 데 사용됩니다. 때로는 변수의 값이 매우 클 때 힙에 저장됩니다.
이 두 가지를 이해한 후에는 탈출 분석에 뛰어들 차례입니다. 단순히 Go 코드를 읽는 것만으로는 어떤 변수가 힙에 할당될지 알 수 있는 방법이 없습니다. 이를 '탈출 분석'으로 이해할 수 있습니다. 이스케이프란 변수가 힙이나 스택에 저장될지 여부를 결정하는 함수 범위를 벗어나는지 여부를 의미합니다.
go 코드의 빌드 명령어를 이렇게 실행하세요
go build -gcflags '-m -l'
-m - 이탈 분석을 표시하는 플래그입니다.
-l - 스택 추적을 정확하게 유지하려면 인라인을 비활성화합니다.
다음 코드를 사용하세요:
package main func escapeExample() *int { x := 42 return &x // x escapes because its address is returned } func noEscapeExample() int { y := 100 return y // y does not escape } func main() { _ = escapeExample() _ = noEscapeExample() }
결과는 다음과 같습니다.
./main.go:4:10: &x escapes to heap ./main.go:12:13: main escapes to heap
그렇다면 우리는 왜 이 모든 일을 하는 걸까요? 이 분석은 성능 문제를 디버깅할 때 유용할 수 있습니다. 변수는 힙보다는 스택에 저장하는 것이 더 좋습니다. 변수가 힙으로 이스케이프되는 위치를 찾고 효율성을 높이기 위해 코드를 리팩터링할 수 있습니다.
오늘 새로운 것을 배웠기를 바랍니다.
저는 현재 API 문서 생성 도구인 LiveAPI를 구축 중입니다. 한번 사용해 보세요.
읽어주셔서 감사합니다.
위 내용은 기본을 넘어서는 GoLang : 탈출 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!