【发布时间】:2015-04-20 14:18:09
【问题描述】:
以下类型转换会产生哪些不同的运行时成本?
-
常量的数字转换,例如:
let f = 0.1 as CGFloat我想这具有零运行时成本。
-
运行时值的数字转换,例如:
let f = someDoubleValue as CGFloat我想这具有极小的运行时成本。
-
Upcast,例如:
let dict: [String: Int] = ... let anyObj = dict as AnyObject我希望它的运行时成本为零。
-
可失败的向下转型,例如:
let anyObj: AnyObject = ... if let str = anyObj as? String { ... }我希望它的运行时成本与
anyObj的动态类型的层次结构中的类数量成正比。 -
强制向下转换,例如:
let anyObj: AnyObject = ... let str = anyObj as! String也许强制下垂的成本略低?
-
强制向下转换集合,例如:
let dates: [AnyObject] = ... for date in dates as! [NSDate] { ... }这里会发生什么——尤其是当
dates来自NSArray时?此演员表的运行时成本是否与其元素的数量成正比?如果我转换为像[String: [String: [Int]]]这样更复杂的集合类型会怎样——是否遍历整个集合以确保其所有元素和子元素都符合这个转换?
对于前四种情况,我的断言是否正确?
【问题讨论】:
-
我猜你的许多问题有太多可能和正确的答案。例如。你的号码2:优化器可以检测
f的使用方式,如果机器架构适合,它可以直接使用someDoubleValue作为Double,而在其他情况下,它必须将值复制到一些额外的内存中。万一它需要内存,因为它可能会将所有内存都保存在寄存器中。如果在这种情况下的性能存在问题:创建一个基准。 -
据我了解,#3 并不是真正向上转换的示例,因为 swift 字典是一个结构,当您将其“转换”为 AnyObject 时,swift 实际上会创建 NSDictionary。这对于 Int -> NSNumber、String -> NSString 和其他必须相同
标签: swift casting time-complexity overhead