> 백엔드 개발 > Golang > 기본을 넘어서는 GoLang : 탈출 분석

기본을 넘어서는 GoLang : 탈출 분석

DDD
풀어 주다: 2024-12-28 19:10:15
원래의
338명이 탐색했습니다.

GoLang beyond basics : Escape analysis

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿