En Swift, los tipos de valor (value types), como struct, enum y tuple, generalmente se colocan en la pila, mientras que los tipos de referencia (reference types), como class, se colocan en el montón (heap).
La asignación en stack es rápida, automática y se utiliza para almacenar variables locales con un tiempo de vida corto. La asignación en heap requiere un costo adicional y se utiliza para objetos con un tiempo de vida o tamaño indefinido.
Ejemplo:
struct Point { var x: Int; var y: Int } let p1 = Point(x: 2, y: 3) // En la pila class Node { var value: Int; init(value: Int) { self.value = value } } let n1 = Node(value: 5) // En el montón
Matices:
Rendimiento: La asignación en stack es más rápida, ya que no requiere trabajar con la memoria en el montón y la gestión del ciclo de vida de los objetos.
¿Siempre se colocan todas las estructuras (struct) exclusivamente en la pila?
Respuesta:
¡No! Aunque las estructuras son tipos de valor y a menudo se colocan en la pila, el compilador puede almacenarlas en el montón si están dentro de un objeto de clase, un array, un diccionario o se utilizan como captured value en un closure. Por ejemplo:
class Box { var point: Point init(point: Point) { self.point = point } } let box = Box(point: Point(x: 1, y: 2))
Aquí, la instancia Point se almacenará en el montón, ya que pertenece a la clase Box.
Historia
Un desarrollador intentó optimizar el rendimiento de las estructuras, pensando que las estructuras grandes siempre estarían en la pila, y no tuvo en cuenta que las colecciones (Array, Dictionary) utilizan asignación en heap, lo que llevó a un aumento inesperado del consumo de memoria en el proyecto.
Historia
En un proyecto no se consideró que el closure captura el valor de la estructura, el cual termina en el montón, afectando el ciclo de vida del objeto. Esto aumentó el tiempo de vida de las variables y provocó fugas de memoria, ya que se esperaba la liberación automática al salir del alcance.
Historia
El uso de arrays de estructuras grandes sin entender copy-on-write llevó a operaciones de copia inesperadamente costosas debido a la transferencia de colecciones entre hilos, disminuyendo el rendimiento y causando retrasos en la interfaz de usuario.