«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как сочетание Println и Fmt.Println влияет на рост стека в Go?

Как сочетание Println и Fmt.Println влияет на рост стека в Go?

Опубликовано 14 ноября 2024 г.
Просматривать:830

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

Совмещение Println и Fmt.Println влияет на рост стека

В Go распределение и рост стека зависят от использования функций например println() и fmt.Println().

Println() vs. Fmt.Println()

Println() — это встроенная функция, известная компилятору, что означает, что ее аргументы не будут убегать в кучу. Напротив, fmt.Println(), принадлежащий стандартной библиотеке, рассматривается как любая определяемая пользователем функция. Компилятор не может гарантировать, что его аргументы не будут экранированы, поэтому эти аргументы размещаются в куче, а не в стеке.

Влияние на рост стека

При запуске стека из пространства выделяется больший стек. Следовательно, переменные, выделенные в стеке, перемещаются, меняя свои адреса. Это перемещение происходит потому, что рекурсивной функции stackCopy() передается значимый аргумент (массив размером 1024). Первоначально выделенного стека недостаточно, что требует увеличения стека и перемещения переменных.

Когда используется fmt.Println(), компилятор распознает, что аргумент s может ускользнуть, и размещает его в куче. В результате рост стека не вызывает движение s.

Анализ побега

Чтобы понять это поведение дальше, можно использовать "-gcflags '-m'" флаги во время компиляции, которые раскрывают escape-анализ компилятора. В случае использования только println() анализ показывает, что s не экранируется. И наоборот, при смешивании println() и fmt.Println() компилятор делает вывод, что s экранируется, и выделяет его в куче.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3