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

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

内容简介:本小节通过性能消耗的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) 
}
复制代码

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

查看所有标签

猜你喜欢:

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

产品经理修炼之道

产品经理修炼之道

费杰 / 机械工业出版社华章公司 / 2012-7-30 / 59.00元

本书由资深产品经理、中国最大的产品经理沙龙Pmcaff创始人费杰亲自执笔,微软、腾讯、百度、新浪、搜狐、奇虎、阿里云、Evernote等国内外20余家大型互联网企业资深产品经理和技术专家联袂推荐。用系统化的方法论和丰富的实战案例解读了优秀产品经理所必须修炼的产品规划能力、产品设计能力、产品执行能力,以及思考、分析和解决问题的能力和方法,旨在为互联网产品经理打造核心竞争力提供实践指导。 全书一......一起来看看 《产品经理修炼之道》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

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

HTML 编码/解码

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

HEX CMYK 互转工具