Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

226
Vistas
Promoción de pila de tipos de referencia

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:

  • PredecibleMemOpt
  • CapturarPromoción
  • AllocBoxToStack

¡Cualquier material de lectura sobre este tema es más que bienvenido!

over 4 years ago · Santiago Trujillo
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda