[swift 进阶]读书笔记-第十章:协议 C10P4 协议内幕 Protocol Internals

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

内容简介:本小节通过性能消耗的Demo来从底层讲了协议底层先看demo明明是同一个Int为嘛后面的方法size就大很多。

本小节通过性能消耗的Demo来从底层讲了协议底层 容器 相关的知识点

先看demo

///使用泛型参数的方法--性能高
func f<C: CustomStringConvertible>(_ x: C) -> Int {
    return MemoryLayout.size(ofValue: x)
}

///使用协议做参数的方法--性能低
func g(_ x: CustomStringConvertible) -> Int {
    return MemoryLayout.size(ofValue: x)
}
f(5) // 8--正常一个Int类型在64位中Int的尺寸
g(5) // 40
复制代码

明明是同一个Int为嘛后面的方法size就大很多。

我们先看看g(5) 值为 40 是怎么组成的,这里面存在一个 不透明的容器 的概念(下图中标注的有)。

40的长度是由三部分组成

1.存储值的缓冲区(3个指针长度) 3 * 8 = 24

2.元数据 8

3.目击表(vtable 可以有0个或者多个 这里有1个) 8

来来,看看我大笔一挥画的灵魂示意图:

[swift 进阶]读书笔记-第十章:协议 C10P4 协议内幕 Protocol Internals

下面我们来说说什么是目击表?(只做了解即可)

目击表是让 动态派发 成为可能的关键,为一个特定的类型将 协议的实现 进行编码,表中会包含一个指向特定类型中的实现的 入口

知识点:如果我们合并多个协议,每多加一个协议,就会多 8 字节的数据块

OC中的协议不需要封装在存在容器中,so~

MemoryLayout.size // 8

性能调优

不推荐:negative_squared_cross_mark:

//隐式打包
func printProtocol(array: [CustomStringConvertible]) {
    print(array) 
}
复制代码

推荐:white_check_mark: swift标准库 中大多数使用场景。

//没有打包
func printGeneric<A: CustomStringConvertible>(array: [A]) {
    print(array) 
}
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

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

Head First Python

Head First Python

Paul Barry / O'Reilly Media / 2010-11-30 / USD 49.99

Are you keen to add Python to your programming skills? Learn quickly and have some fun at the same time with Head First Python. This book takes you beyond typical how-to manuals with engaging images, ......一起来看看 《Head First Python》 这本书的介绍吧!

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

在线压缩/解压 HTML 代码

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具