加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

优化 – 使用“if let”解压缩堆栈对象(例如结构)

发布时间:2020-12-14 04:32:40 所属栏目:百科 来源:网络整理
导读:这是关于 Swift可选堆栈对象(例如struct)和“if let”的Swift编译器优化问题. 在Swift中,“if let”为您提供了一个语法糖来与选项一起使用. 生活在堆栈上的结构怎么样?作为一名程序员,我不会引入堆栈对象的不必要的副本,特别是为了检查它在容器中的存在.每
这是关于 Swift可选堆栈对象(例如struct)和“if let”的Swift编译器优化问题.

在Swift中,“if let”为您提供了一个语法糖来与选项一起使用.
生活在堆栈上的结构怎么样?作为一名程序员,我不会引入堆栈对象的不必要的副本,特别是为了检查它在容器中的存在.每次使用“if let”时,是否会以递归方式复制结构的所有成员,或者swift编译器的优化程度足以通过引用或使用其他技巧创建局部变量?

例如,我们将这个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())
}

解决方法

since the struct is on the stack,to unpack,is there an unnecessary copy from the container optionalData to local var data,or the fact that the data is a constant,the copy is optimized away?

编译器不太可能实际发出代码来制作副本.让本质上给表达式另一个名字.

对于类,“让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())
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读