Mientras profundizaba un poco más en el tema de cómo el compilador Swift administra la memoria, leí la documentación de SIL y encontré la instrucción alloc_ref . La descripción dice que
El atributo de pila opcional indica que el objeto se puede asignar en la pila en lugar de en el montón.
Por lo que entiendo, siempre que el tamaño de un tipo sea fijo (por ejemplo, struct simple), se puede almacenar en la pila.
Ahora, tratar de encontrar un ejemplo en el que se use el indicador [stack] realmente no satisfizo mis expectativas:
final class Foo { let bar = 0 } La salida SIL (usando swiftc -emit-silgen -O main.swift ) me da:
// Foo.__allocating_init() sil hidden [exact_self_class] [ossa] @$s4main3FooCACycfC : $@convention(method) (@thick Foo.Type) -> @owned Foo { // %0 "$metatype" bb0(%0 : $@thick Foo.Type): %1 = alloc_ref $Foo // user: %3 // function_ref Foo.init() %2 = function_ref @$s4main3FooCACycfc : $@convention(method) (@owned Foo) -> @owned Foo // user: %3 %3 = apply %2(%1) : $@convention(method) (@owned Foo) -> @owned Foo // user: %4 return %3 : $Foo // id: %4 } // end sil function '$s4main3FooCACycfC' // Foo.init() sil hidden [ossa] @$s4main3FooCACycfc : $@convention(method) (@owned Foo) -> @owned Foo { // %0 "self" // users: %2, %1 bb0(%0 : @owned $Foo): debug_value %0 : $Foo, let, name "self", argno 1 // id: %1 %2 = mark_uninitialized [rootself] %0 : $Foo // users: %10, %9, %3 %3 = begin_borrow %2 : $Foo // users: %8, %4 %4 = ref_element_addr %3 : $Foo, #Foo.bar // user: %7 // function_ref variable initialization expression of Foo.bar %5 = function_ref @$s4main3FooC3barSivpfi : $@convention(thin) () -> Int // user: %6 %6 = apply %5() : $@convention(thin) () -> Int // user: %7 store %6 to [trivial] %4 : $*Int // id: %7 end_borrow %3 : $Foo // id: %8 %9 = copy_value %2 : $Foo // user: %11 destroy_value %2 : $Foo // id: %10 return %9 : $Foo // id: %11 } // end sil function '$s4main3FooCACycfc'¿Me estoy perdiendo algo aquí o no entiendo el concepto de un tipo de tamaño fijo?
Otras fuentes:
¡Cualquier material de lectura sobre este tema es más que bienvenido!