"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > `Println`과 `Fmt.Println`을 혼합하면 Go에서 스택 성장에 어떤 영향을 미치나요?

`Println`과 `Fmt.Println`을 혼합하면 Go에서 스택 성장에 어떤 영향을 미치나요?

2024년 11월 14일에 게시됨
검색:370

How Does Mixing `Println` and `Fmt.Println` Impact Stack Growth in Go?

Println과 Fmt.Println 혼합이 스택 증가에 미치는 영향

Go에서 스택의 할당과 증가는 함수 사용에 따라 달라집니다. println() 및 fmt.Println()과 같습니다.

Println() 대 Fmt.Println()

Println()은 컴파일러에 알려진 내장 함수입니다. , 이는 해당 인수가 힙으로 이스케이프되지 않음을 의미합니다. 반면, 표준 라이브러리에 속하는 fmt.Println()은 사용자 정의 함수처럼 취급됩니다. 컴파일러는 인수가 이스케이프되지 않을 것이라고 보장할 수 없으므로 이러한 인수는 스택이 아닌 힙에 할당됩니다.

스택 성장에 미치는 영향

스택이 실행될 때 공간이 부족하면 더 큰 스택이 할당됩니다. 결과적으로 스택에 할당된 변수가 이동되어 해당 주소가 변경됩니다. 이러한 이동은 재귀 함수 stackCopy()에 중요한 인수(크기 1024의 배열)가 전달되었기 때문에 발생합니다. 할당된 초기 스택이 충분하지 않아 더 큰 스택과 변수 재배치가 필요합니다.

fmt.Println()이 사용되면 컴파일러는 인수 s가 이스케이프될 수 있음을 인식하고 이를 힙에 할당합니다. 결과적으로 스택 증가는 s의 움직임을 유발하지 않습니다.

이스케이프 분석

이 동작을 더 자세히 이해하려면 "-gcflags '-m'"을 활용할 수 있습니다. 컴파일러의 이스케이프 분석을 공개하는 컴파일 중 플래그. println()만 사용하는 경우 분석 결과 s가 이스케이프되지 않는 것으로 나타났습니다. 반대로, println()과 fmt.Println()을 혼합하면 컴파일러는 s가 이스케이프한다고 추론하고 이를 힙에 할당합니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3