广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >浅谈Swift派发机制
  • 233
分享到

浅谈Swift派发机制

2024-04-02 19:04:59 233人浏览 八月长安
摘要

目录直接派发函数表派发消息机制派发具体派发直接派发 c++ 默认使用的是直接派发,加上 virtual 修饰符可以改成函数表派发。直接派发是最快的,原因是调用指令会少,还可以通过编译

直接派发

c++ 默认使用的是直接派发,加上 virtual 修饰符可以改成函数表派发。直接派发是最快的,原因是调用指令会少,还可以通过编译器进行比如内联等方式的优化。缺点是由于缺少动态性而不支持继承。


struct DraGonFirePosition {
var x:Int64
var y:Int32
func land() {}
}
 
func DragonWillFire(_ position:DragonFirePosition) {
position.land()
}
let position = DragonFirePosition(x: 342, y: 213)
DragonWillFire(position)

编译 inline 后 DragonWillFire(DragonFirePosition(x: 342, y: 213)) 会直接跳到方法实现的地方,结果就变成 position.land()。

函数表派发

Java 默认就是使用的函数表派发,通过 final 修饰符改成直接派发。函数表派发是有动态性的,在 Swift 里函数表叫 witness table,大部分语言叫 virtual table。一个类里会用数组来存储里面的函数指针,override 父类的函数会替代以前的函数,子类添加的函数会被加到这个数组里。举个例子:


class Fish {
func swim() {}
func eat() {
//nORMal eat
}
}
 
class FlyingFish: Fish {
override func eat() {
//flying fish eat
}
func fly() {}
}

编译器会给 Fish 类和 FlyingFish 类分别创建 witness table。在 Fish 的函数表里有 swim 和 eat 函数,在 FlyingFish 函数表里有父类 Fish 的 swim,覆盖了父类的 eat 和新增加的函数 fly。

一个函数被调用时会先去读取对象的函数表,再根据类的地址加上该的函数的偏移量得到函数地址,然后跳到那个地址上去。从编译后的字节码这方面来看就是两次读取一次跳转,比直接派发还是慢了些。

消息机制派发

这种机制是在运行时可以改变函数的行为,KVO 和 CoreData 都是这种机制的运用。OC 默认就是使用的消息机制派发,使用 C 来直接派发获取高性能。Swift 可以通过 dynamic 修饰来支持消息机制派发。

当一个消息被派发,运行时就会按照继承关系向上查找被调用的函数。但是这样效率不高,所以需要通过缓存来提高效率,这样查找性能就能和函数派发差不多了。

具体派发

声明

值类型都会采用直接派发。无论是 class 还是协议 的 extension 也都是直接派发。class 和协议是函数表派发。

指定派发方式

  • final:让类里的函数使用直接派发,这样该函数将会没有动态性,运行时也没法取到这个函数。
  • dynamic:可以让类里的函数使用消息机制派发,可以让 extension 里的函数被 override。

派发优化

Swift 会在这上面做优化,比如一个函数没有 override,Swift 就可能会使用直接派发的方式,所以如果属性绑定了 KVO 它的 getter 和 setter 方法可能会被优化成直接派发而导致 KVO 的失效,所以记得加上 dynamic 的修饰来保证有效。后面 Swift 应该会在这个优化上去做更多的处理。

以上就是浅谈Swift派发机制的详细内容,更多关于Swift派发机制的资料请关注编程网其它相关文章!

--结束END--

本文标题: 浅谈Swift派发机制

本文链接: https://www.lsjlt.com/news/127740.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 浅谈Swift派发机制
    目录直接派发函数表派发消息机制派发具体派发直接派发 C++ 默认使用的是直接派发,加上 virtual 修饰符可以改成函数表派发。直接派发是最快的,原因是调用指令会少,还可以通过编译...
    99+
    2022-11-12
  • 【Android】 浅谈Handler机制
    Handler机制产生的原因 在谈论一个机制之前,需要了解这个机制设计出来是为了解决什么问题。 Handler设计出来就是因为UI线程不能进行耗...
    99+
    2022-06-06
    handler机制 handler Android
  • 浅谈Java锁机制
    目录1、悲观锁和乐观锁2、悲观锁应用3、乐观锁应用4、CAS5、手写一个自旋锁1、悲观锁和乐观锁 我们可以将锁大体分为两类: 悲观锁 乐观锁 顾名思义,悲观锁总是...
    99+
    2022-11-12
  • 浅谈Python pygame绘制机制
    pygame绘制机制简介  屏幕控制 pygame.display • 用来控制Pygame游戏的屏幕 • Pygame有且只有一个屏幕 • 屏幕左上角坐标为(0,0) ...
    99+
    2022-06-02
    pygame绘制机制 python pygame
  • 浅谈Java内省机制
    目录概念JavaBean内省相关API代码案例:获取属性相关信息内省属性的注意事项完整代码概念 JavaBean 在实际编程中,我们常常需要一些用来包装值对象的类,例如Student...
    99+
    2022-11-13
    Java内省机制 Java内省
  • 浅谈Linux信号机制
    目录一、信号列表1.1、实时信号非实时信号1.2、信号状态1.3、信号生命周期1.4、信号的执行和注销二、信号掩码和信号处理函数的继承2.1、信号处理函数的继承2.2、信号掩码的继承2.3、sigwait 与多线程2...
    99+
    2022-06-03
    Linux 信号机制
  • 浅谈Java 代理机制
    目录一、常规编码方式二、代理模式概述三、静态代理3.1、什么是静态代理3.2、代码示例四、Java 字节码生成框架五、什么是动态代理六、JDK 动态代理机制6.1、使用步骤6.2、代...
    99+
    2022-11-12
  • 浅谈AndroidDialog窗口机制
    目录问题引出Dialog源码分析构造方法show()方法问题引出 //创建dialog 方式一 AlertDialog.Builder builder=new AlertDialo...
    99+
    2022-11-13
  • 浅谈numpy广播机制
    目录Broadcast最简单的广播机制稍微复杂的广播机制广播机制到底做了什么一个正确的经典示例一种更便捷的计算方式Broadcast 广播是numpy对不同形状(shape)的数组进...
    99+
    2023-02-15
    numpy 广播机制
  • 浅谈Redis缓冲区机制
    目录Redis缓冲区机制客户端缓冲机制应对输入缓冲区溢出查看输入缓冲区信息如何解决输入缓冲区溢出应对输出缓冲区溢出Monitor命令的执行输出缓冲区设置不合理主从集群中的缓冲区复制缓...
    99+
    2022-11-13
  • 浅谈node的事件机制
    Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. 在nodejs的...
    99+
    2022-06-04
    浅谈 机制 事件
  • 浅谈Android Aidl 通讯机制
    服务端: 首先是编写一个aidl文件,注意AIDL只支持方法,不能定义静态成员,并且方法也不能有类似public等的修饰符;AIDL运行方法有任何类型的参数和返回值,在jav...
    99+
    2022-06-06
    aidl Android
  • 浅谈Redis的异步机制
    目录前言一、Redis 的阻塞点4 类交互对象和具体的操作之间的关系:切片集群实例交互时的阻塞点二、可以异步执行的阻塞点三、异步的子线程机制总结前言 命令操作、系统配置、关键机制、硬...
    99+
    2022-11-13
  • 浅谈Servlet的Cookie和Session机制
    目录一、Servlet Cookies1.1 Cookies构成1.2 Servlet操作Cookie方法1.3 代码示例:1.4 验证结果二、Servlet Session2.1 ...
    99+
    2022-11-12
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2022-11-12
  • 怎样浅谈Java访问控制机制
    怎样浅谈Java访问控制机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java 访问控制机制的原理是:在某些策略配置文件中预定义好某些代码对某些资源具有某些操作权限,当...
    99+
    2023-06-17
  • 浅谈Android IPC机制之Binder的工作机制
    目录进程和线程的关系跨进程的种类Serializable,Parcelable接口Binder进程和线程的关系 按照操作系统中的描述,线程是CPU调度的最小单位,同时线程也是一种有限...
    99+
    2022-11-12
  • 浅谈Node异步编程的机制
    本文介绍了Node异步编程,分享给大家,具体如下: 目前的异步编程主要解决方案有: 事件发布/订阅模式 Promise/Deferred模式 流程控制库 事件发布/订阅模式 Node自身提供...
    99+
    2022-06-04
    浅谈 机制 Node
  • 浅谈Python的垃圾回收机制
    一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。 在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。 #en...
    99+
    2022-06-04
    浅谈 机制 垃圾
  • 浅谈Python浅拷贝、深拷贝及引用机制
    这礼拜碰到一些问题,然后意识到基础知识一段时间没巩固的话,还是有遗忘的部分,还是需要温习,这里做份笔记,记录一下 前续 先简单描述下碰到的题目,要求是写出2个print的结果 可以看到,a指向了一个列表...
    99+
    2022-06-04
    浅谈 机制 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作