Mezcla de efectos de Println y Fmt.Println en el crecimiento de la pila
En Go, la asignación y el crecimiento de la pila dependen del uso de funciones como println() y fmt.Println().
Println() vs. Fmt.Println()
Println() es una función incorporada conocida por el compilador , lo que implica que sus argumentos no escaparán al montón. Por el contrario, fmt.Println(), que pertenece a la biblioteca estándar, se trata como cualquier función definida por el usuario. El compilador no puede garantizar que sus argumentos no escapen, por lo que estos argumentos se asignan en el montón en lugar de en la pila.
Impacto en el crecimiento de la pila
Cuando se ejecuta la pila Sin espacio, se asigna una pila más grande. En consecuencia, las variables asignadas en la pila se mueven y cambian sus direcciones. Este movimiento se produce porque a la función recursiva stackCopy() se le pasa un argumento significativo (una matriz de tamaño 1024). La pila inicial asignada es insuficiente, lo que requiere una pila más grande y la reubicación de variables.
Cuando se usa fmt.Println(), el compilador reconoce que el argumento s puede escapar y lo asigna en el montón. Como resultado, el crecimiento de la pila no desencadena el movimiento de s.
Análisis de escape
Para comprender mejor este comportamiento, se puede aprovechar "-gcflags '-m'" banderas durante la compilación, que revelan el análisis de escape del compilador. En el caso de utilizar únicamente println(), el análisis revela que s no escapa. Por el contrario, al mezclar println() y fmt.Println(), el compilador infiere que s se escapa y lo asigna en el montón.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3