typealiasFn=(Int)->IntfuncgetFn()->Fn{var num =0//当num没有被plus调用时候,是放在栈里//当num被plus调用后,放在堆中,所以下面的四次调用访问的都是堆空间的funcplus(_ i:Int)->Int{
num += i
return num
}return plus
}var fn1 =getFn()//调用一次只分配一次堆空间print(fn1(1))// 1print(fn1(2))// 3print(fn1(3))// 6print(fn1(4))// 10//所有fn1调用完毕以后重新初始化,初始化的值由num的值来确定。var fn2 =getFn()print(fn2(5))// 5print(fn2(6))// 11print(fn2(7))// 18print(fn2(8))// 26//堆空间需要多少内存:首先申请堆空间内存时候应该会给alloc传入一个参数,//传达这个值需要多少堆空间。//所以在汇编中寻找申请前传入了什么参数,比如rdi,rsi,rdx等//堆空间前16存储了这个值类型的地址和引用计数,然后类型需要多少位//之后以16的倍数补齐。