美文网首页
Swift - 闭包捕获值原理分析

Swift - 闭包捕获值原理分析

作者: 码代码的小马 | 来源:发表于2021-12-09 17:37 被阅读0次

先说原理本质:
编译器在堆上开辟空间,存放了捕获的值

看代码和打印:

func makeIncriementer() -> () -> Int {
    var runnintTotal = 10
    
    func incriementer() -> Int {
        runnintTotal += 1
        return runnintTotal
    }
    return incriementer
}

let makeInc = makeIncriementer()

print(makeInc())
print(makeInc())
print(makeInc())

打印输出:

11
12
13

将代码编译成SIL源码查看
附: 编译指令:swiftc -emit-sil main.swift | xcrun swift-demangle >> ./main.sil

// makeIncriementer()
sil hidden @main.makeIncriementer() -> () -> Swift.Int : $@convention(thin) () -> @owned @callee_guaranteed () -> Int {
bb0:
  %0 = alloc_box ${ var Int }, var, name "runnintTotal" // users: %8, %7, %6, %1
  %1 = project_box %0 : ${ var Int }, 0           // user: %4
  %2 = integer_literal $Builtin.Int64, 10         // user: %3
  %3 = struct $Int (%2 : $Builtin.Int64)          // user: %4
  store %3 to %1 : $*Int                          // id: %4
  // function_ref incriementer #1 () in makeIncriementer()
  %5 = function_ref @incriementer #1 () -> Swift.Int in main.makeIncriementer() -> () -> Swift.Int : $@convention(thin) (@guaranteed { var Int }) -> Int // user: %7
  strong_retain %0 : ${ var Int }                 // id: %6
  %7 = partial_apply [callee_guaranteed] %5(%0) : $@convention(thin) (@guaranteed { var Int }) -> Int // user: %9
  strong_release %0 : ${ var Int }                // id: %8
  return %7 : $@callee_guaranteed () -> Int       // id: %9
} // end sil function 'main.makeIncriementer() -> () -> Swift.Int'

通过源码可以看到,编译器将runnintTotal这个变量是通过
%0 = alloc_box ${ var Int }, var, name "runnintTotal" // users: %8, %7, %6, %1创建的

关于alloc_box 本质是在堆上开辟内存空间,存储了metadata、refrcount、value

WX20211209-172855@2x.png

参照:
SIL开发文档
SIL开发文档-allocBox
The LLVM Compiler Infrastructure
Swift的高级中间语言:SIL

相关文章

  • Swift - 闭包捕获值原理分析

    先说原理本质:编译器在堆上开辟空间,存放了捕获的值 看代码和打印: 打印输出: 将代码编译成SIL源码查看附: 编...

  • 闭包

    闭包 本节内容包括: 闭包表达式 尾随闭包 值捕获 闭包是引用类型 Swift 中的闭包与 C 和 Objecti...

  • Swift-闭包

    Swift-闭包 Swift闭包的含义 闭包是自包含的功能代码块,可以用作函数的参数或者返回值 闭包可以捕获上下文...

  • Swift-08:闭包

    1.分析闭包以及闭包捕获变量的原理2.逃逸闭包 & 非逃逸闭包 一、闭包 闭包是一个捕获了全局上下文的常量或者变量...

  • Swift-进阶 :闭包(一)使用&捕获原理

    本文主要分析闭包以及闭包捕获变量的原理 闭包 闭包是一个捕获了全局上下文的常量或者变量的函数,通俗来讲,闭包可以是...

  • Swift--闭包

    闭包的概念 Swift闭包表达式 使用闭包返回值 使用尾随闭包 捕获上下文中的变量和常量 支持闭包有两个前提1、支...

  • swift4 闭包

    swift 闭包 闭包:swift 中 函数是闭包的一种类似于oc的闭包闭包表达式(匿名函数) -- 能够捕获上下...

  • swift- 闭包一

    /*• 闭包表达式• 尾随闭包• 值捕获• 闭包是引用类型• 逃逸闭包• 自动闭包*/

  • Swift 闭包的值捕获

    以下函数会打印出什么? 因为 clousre 已经申明将 car 复制进去了([car]),此时clousre里的...

  • Swift Tour Learn (五) -- Swift 语法

    本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...

网友评论

      本文标题:Swift - 闭包捕获值原理分析

      本文链接:https://www.haomeiwen.com/subject/nlwffrtx.html