前言(未完成)
defer
defer 的前世今生未读完
defer 给我们的第一感觉其实是一个编译期特性,为什么 defer 会需要运行时的支持? 未完成
defer 的早期实现其实是非常的粗糙的。每当出现一个 defer 调用,都会在堆上分配 defer 记录,并对参与调用的参数实施一次拷贝操作,然后将其加入到 defer 链表上;当函数返回需要触发 defer 调用时,依次将 defer 从链表中取出,完成调用。当然最初的实现并不需要完美,未来总是可以迭代其性能问题。
在 Go 1.14 中,Dan Scales 作为 Go 团队的新成员,defer 的优化成为了他的第一个项目。他提出开放式编码 defer [Scales, 2019],通过编译器辅助信息和延迟比特在函数末尾处直接获取调用函数及参数,完成了近乎零成本的 defer 调用,在一定条件下让 defer 进化为一个仅编译期特性。