内容简介:本小节讲了一些关于泛型编译器无法为这个函数swift 为函数引入了一套间接的
本小节讲了一些关于泛型 底层
的知识点和一些 特殊情况下
的使用。可以当做扩充知识面去学习。
我们先看看一个最简单的泛型函数的底层实现
func min<T: Comparable>(_ x: T, _ y: T) -> T { returny<x?y:x } 复制代码
编译器无法为这个函数 直接生产代码
,原因如下:
1.编译器不知道T的```变量大小``` 2.编译器不知道需要调用的<函数是否有重载,所以也不知道需要调用的```函数的地址``` 复制代码
swift 为函数引入了一套间接的 中间层
来解决这个问题,引入了一个容器,编译器会把泛型放到这个容器中
对于泛型的参数,编译器还维护了一个或者多个 目击表(witness table)
,包括一个 值目击表
,以及每个协议约束的 协议目击表
。 这些表将运行时的函数 动态派发
到正确的实现中。 表里实际上放的都是 指针
。同时还记录了 类型大小和对齐方式
。
泛型特化
光看泛型特化这个词很难理解它的用法和意思,后面我们会讲。
使用泛型特化的原因:
大家先了解一个swift的设计目标: "编译一次,动态派发"
swift 泛型API只需要知道泛型函数或者类型的声明,并 不关心实现
。
所以结果的代码不是那么直接。这会导致 运行时性能低
swift库中有很多泛型的使用,性能开销很容易叠加。
这里就引入了 泛型特化(generic specialization)
来避免这个不必要的开销。
泛型特化的本质:
编译器按照 具体的参数类型
将函数进行 复制
。
文章一开始的例子中,可能针对于Int的参数类型特化出一个方法是这样的
func min(_ x: Int, _ y: Int) -> Int { returny<x?y:x } 复制代码
泛型特化不仅能 去掉虚拟派发的开销
, 还可以让 内联
等进一步优化成为可能
泛型特化的决定在 编译时
进行。特化的参数类型很可能是你 经常使用
的具体类型,
如果你经常使用Int 只用过一次float 那么就会特化出上面的函数。
缺点:泛型定义和调用在 同一个文件中
时,泛型特化才能工作,只能在模块内使用:sweat_smile:(标准库中的泛型方法除外,因为标准库的定义对于所有模块都是可见的)
全模块优化
因为泛型特化是一个很严重的限制,所以编译器引入了一个标志来启用 全模块优化
可以通过向 swiftc 传递 -whole-module-optimization 来开启全模块优化
一般都是在 发布版本中
进行这项操作,
优点:
大幅度提升性能 缺点:
会带来更长的编译时间
@_specialize 关键字
@_specialize
是一个 非官方
的标签,计划将来会引入到标准库中。
作用:将你的泛型代码进行指定版本的特化,使其在 其他模块中
也可用。(你必须要指明想要进行特化的类型列表)
使用如下:
@_specialize(exported: true, where T == Int) @_specialize(exported: true, where T == String) public func min<T: Comparable>(_ x: T, _ y: T) -> T { returny<x?y:x } 复制代码
over~
以上所述就是小编给大家介绍的《[swift 进阶]读书笔记-第九章:泛型 C9P4 泛型的工作方式 How Generics Work》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- vue ssr 实现方式学习笔记
- Spring框架学习笔记2(IOC注解方式&AOP)
- 机器学习笔记(十三):重中之重的性能度量方式你要懂
- 机器学习笔记(十三)——重中之重的性能度量方式你要懂
- 间歇性笔记--Vue组件间通信传值的各种方式
- elasticsearch学习笔记(六)——快速入门案例实战之电商网站商品管理:多种搜索方式
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
来吧!带你玩转 Excel VBA
罗刚君、杨嘉恺 / 电子工业出版社 / 2013-7 / 85.00元
本书旨在普及Excel VBA 基础理论,以及通过VBA 的高级应用扩展Excel 的功能,提升读者的制表效率,解决工作中的疑难,同时亦可借此开发商业插件。 本书主要分为操作自动化引言篇、入门篇、进阶篇和疑难解答篇,覆盖从入门到提高的所有内容,以满足不同层次的读者需求。其中操作自动化引言篇简述了操作自动化的需求与方式,借此引出VBA 入门篇。VBA 入门篇包含第2 章到第13 章,主要介绍了......一起来看看 《来吧!带你玩转 Excel VBA》 这本书的介绍吧!