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