优化 – 使用“if let”解压缩堆栈对象(例如结构)
这是关于
Swift可选堆栈对象(例如struct)和“if let”的Swift编译器优化问题.
在Swift中,“if let”为您提供了一个语法糖来与选项一起使用. 例如,我们将这个struct打包成一个可选的: struct MyData{ var a=1 var b=2 //lots more store.... func description()->String{ return "MyData: a="+String(a)+",b="+String(b) } } var optionalData:MyData?=nil optionalData=MyData() 由于结构在堆栈上,要解压缩,是否有一个从容器optionalData到本地var数据的不必要的副本,或者数据是常量的事实,副本是否被优化了? if let data=optionalData{//is data copy or reference? println(data.description()) } 解决方法
编译器不太可能实际发出代码来制作副本.让本质上给表达式另一个名字. 对于类,“让x = y”将允许您通过x的副本进行写入(因为您只是复制引用),即 let x = y x.foo = bar y.foo // => bar 但结构,情况并非如此.您不能写入let结构或调用任何可变方法.这允许Swift编译器将let x = y(其中y是结构)视为no-op. 但是,这段代码可能会复制y: y.foo = bar let x = y y.foo = baz x.foo // => bar 它必须,因为你写了你正在复制的东西.这被称为“copy-on-write”,它是通过使用let语义实现的优化. 回答你的最后一个问题: if let data=optionalData{//is data copy or reference? println(data.description()) } 在这种情况下,数据肯定是一个参考.实际上它可能根本不存在;编译器将发出与您编写的相同的代码: if (optionalData != nil) { println(optionalData!.description()) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |