当前位置: 首页 > 面试题库 >

Swift有动态分配和虚拟方法吗?

商泽宇
2023-03-14
问题内容

从C ++ / Java / C#背景开始,我期望在Swift中看到虚拟方法,但是在阅读swift文档时,我没有提到虚拟方法。

我想念什么?


问题答案:

与C ++不同,不必在Swift中指定方法是虚拟的。编译器将计算出要使用以下哪个:

(性能指标当然取决于硬件)

  • 内联方法:0 ns
  • 静态调度:<1.1ns
  • 虚拟调度1.1ns(指定时类似于Java,C#或C ++)。
  • 动态分配4.9ns(如Objective-C)。

当然,Objective-C始终使用后者。4.9ns的开销通常不是问题,因为这只占整个方法执行时间的一小部分。但是,必要时开发人员可以无缝地回退到C或C
++。但是,在Swift中,编译器将分析可以使用最快的哪个,并尝试代表您进行决策,支持内联,静态和虚拟,但保留用于Objective-
C互操作性的消息传递。可以标记一种dynamic鼓励消息传递的方法。

这样做的一个副作用是,动态分配所提供的某些强大功能可能不可用,因为以前假定任何Objective-
C方法都是这种情况。动态分派用于方法拦截,依次由以下人员使用:

  • 可可风格的财产观察员。
  • CoreData模型对象检测。
  • 面向方面的编程

以上是late binding语言提供的功能。请注意,尽管Java使用vtable调度进行方法调用,但它仍被认为是一种后期绑定语言,因此由于具有虚拟机和类加载器系统而具有上述功能,这是提供运行时检测的另一种方法。“纯”
Swift(不带Objective-C互操作)类似于C
++,因为它是具有静态分派的直接可执行的编译语言,因此在运行时这些动态功能是不可能的。按照ARC的传统,我们可能会看到更多此类功能正在编译时移动,这在“每瓦性能”方面具有优势-
这是移动计算中的重要考虑因素。



 类似资料:
  • 问题内容: 在继承中虚拟函数如何在后台工作?编译器是否特别对待虚拟函数? 问题答案: 是的,编译器和运行时对虚拟方法的处理方式有所不同。JVM专门利用虚拟方法表进行虚拟方法分配: 对象的调度表将包含对象的动态绑定方法的地址。通过从对象的分派表中获取方法的地址来执行方法调用。属于同一类的所有对象的分发表都是相同的,因此通常在它们之间共享。属于类型兼容类的对象(例如,继承层次结构中的同级对象)将具有具

  • 本文档描述如何使用Apache有效的架设大批量虚拟主机。 动机 如果你的配置文件httpd.conf中包含类似下面的许多<VirtualHost>段,并且其中的内容都大致相同的话,你应该会对这里所讲的技术感兴趣。比如: NameVirtualHost 111.22.33.44 <VirtualHost 111.22.33.44> ServerName www.customer-1.com Docu

  • 本文向大家介绍Tomcat7.0设置虚拟目录配置虚拟路径的方法讲解,包括了Tomcat7.0设置虚拟目录配置虚拟路径的方法讲解的使用技巧和注意事项,需要的朋友参考一下 Tomcat7.0设置虚拟目录 (1)目前,我们的网站站点都是放在默认的目录下:tomcat/webapps/下的。但是,在某种情况下,我们需要把站点放到其他的目录,比如:tomcat所在磁盘的空间不足; 或者为了项目的统一管理,希

  • Flutter:没有虚拟方法getLongVersionCode(),Sdk 29 有人知道怎么解决吗? /content/pm/packageinfo;或其超类(声明

  • 在安装到AEM 5.6.1实例之前,我正在使用maven构建和测试我的代码。我已经编写了单元测试,这些测试使用wcm的实现从aem模拟中获益。io和其他需要使用powermockito模拟静态方法的单元测试。 以下是我对aem上下文、sling Mock和powermock的maven依赖关系。 在我的课堂上,我正在为aem上下文设置规则,并准备一些用于模拟的静态类: 当我通过命令行运行mvn测试