【发布时间】:2014-09-18 16:03:27
【问题描述】:
我试图弄清楚Swift 泛型是如何工作的。具体来说,我没能找到关于编译模型的准确陈述。在 C++ 中,泛型(模板)不是单独编译的,因为它们是为每个调用站点实例化的(至少在原则上)。相反,Java 泛型是单独编译的。关于泛型的单独编译,Swift 的情况如何?
【问题讨论】:
-
我似乎记得在今年的高级 WWDC 会议视频之一中谈到了这一点。虽然很抱歉,但不能更具体:)
我试图弄清楚Swift 泛型是如何工作的。具体来说,我没能找到关于编译模型的准确陈述。在 C++ 中,泛型(模板)不是单独编译的,因为它们是为每个调用站点实例化的(至少在原则上)。相反,Java 泛型是单独编译的。关于泛型的单独编译,Swift 的情况如何?
【问题讨论】:
它是两者的结合,取决于优化器决定什么会获得更好的性能。他们在WWDC Session 404: Advanced Swift 结尾处谈论它。幻灯片上写着:
Swift 可以直接运行通用代码
优化器可以随意生成通用代码的专用版本
- 泛型的单独编译
- 编译速度更快
- 以代码大小换取速度的灵活性
【讨论】:
在语义上,它类似于 C++ 方式。在使用T 参数化的Swift 泛型函数中,您可以在运行时直接使用T 访问事物,例如T.self。您也可以在 C++ 中执行此操作,但不能在 Java 中执行此操作,因为泛型仅在编译时进行,之后会被类型擦除。
【讨论】: