美文网首页
[swift 进阶]读书笔记-第九章:泛型 C9P4 泛型的工

[swift 进阶]读书笔记-第九章:泛型 C9P4 泛型的工

作者: liaoworkinn | 来源:发表于2019-04-20 14:03 被阅读0次

第九章:泛型 Generics

9.4 泛型的工作方式(How Generics Work)

本小节讲了一些关于泛型底层的知识点和一些特殊情况下的使用。可以当做扩充知识面去学习。

我们先看看一个最简单的泛型函数的底层实现

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 那么就会特化出上面的函数。

缺点:泛型定义和调用在同一个文件中时,泛型特化才能工作,只能在模块内使用😅(标准库中的泛型方法除外,因为标准库的定义对于所有模块都是可见的)

全模块优化

因为泛型特化是一个很严重的限制,所以编译器引入了一个标志来启用全模块优化

可以通过向 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 泛型的工

    第九章:泛型 Generics 9.4 泛型的工作方式(How Generics Work) 本小节讲了一些关于泛...

  • 【Swift】泛型常见使用

    1、Swift泛型4种 泛型函数泛型类型泛型协议泛型约束 2、泛型约束3种 继承约束:泛型类型 必须 是某个类的子...

  • iOS 强大的泛型

    文章围绕一下五点进行介绍: 泛型是什么为什么要用泛型泛型怎么用泛型进阶泛型的延伸使用 泛型(Generics)是什...

  • 泛型

    泛型 1.为什么要有泛型?2.泛型有什么好处?3.Swift泛型语法4.泛型的使用 为什么要有泛型 在编程世界中,...

  • Swift-泛型笔记

    Swift 泛型 Swift 提供了泛型让你写出灵活且可重用的函数和类型。 Swift 标准库是通过泛型代码构建出...

  • [ WWDC2018 ] - Swift 泛型 Swift Ge

    Swift 泛型历史 我们首先来回顾一下 Swift 中对于泛型支持的历史变更,看看现在在 Swift 中,泛型都...

  • Swift 运用协议泛型封装网络层

    Swift 运用协议泛型封装网络层 Swift 运用协议泛型封装网络层

  • 2021-12-01

    swift5基本语法-泛型函数和泛型类型 Swift中泛型可以将类型参数化,提高代码复用率,减少代码量。 一、泛型...

  • Swift进阶 :泛型

    swift 进阶之路:学习大纲[https://www.jianshu.com/p/115367c3eefd] 本...

  • Swift进阶-泛型

    为什么会有泛型? 我们发现, multiNumInt(::) 、 multiNumDouble(::) 函数体是...

网友评论

      本文标题:[swift 进阶]读书笔记-第九章:泛型 C9P4 泛型的工

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