Совмещение 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