内容简介:本小节通过性能消耗的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
来来,看看我大笔一挥画的灵魂示意图:
下面我们来说说什么是目击表?(只做了解即可)
目击表是让 动态派发
成为可能的关键,为一个特定的类型将 协议的实现
进行编码,表中会包含一个指向特定类型中的实现的 入口
。
知识点:如果我们合并多个协议,每多加一个协议,就会多 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) } 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Masterminds of Programming
Federico Biancuzzi、Chromatic / O'Reilly Media / 2009-03-27 / USD 39.99
Description Masterminds of Programming features exclusive interviews with the creators of several historic and highly influential programming languages. Think along with Adin D. Falkoff (APL), Jame......一起来看看 《Masterminds of Programming》 这本书的介绍吧!