[swift 进阶]读书笔记-第九章:泛型 C9P4 泛型的工作方式 How Generics Work

栏目: Swift · 发布时间: 5年前

内容简介:本小节讲了一些关于泛型编译器无法为这个函数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》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

操作系统

操作系统

William Stallings / 陈向群、陈渝 / 机械工业出版社 / 2010.9 / 69.00元

本书不仅全面地讲述了操作系统的基本概念、原理和方法,还清楚地展现了当代操作系统的本质和特点。作者针对近几年操作系统领域的最新变化,对操作系统的设计原理进行深入的阐述,同时将其对操作系统整个领域全面而深入的理解呈现给读者。 本书特色 ·选择Windows Vista、UNIX和Linux三个操作系统作为示例,以帮助读者熟悉当代操作系统的设计原理和实现问题。 ·新增嵌入式操作系统一章......一起来看看 《操作系统》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码