Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 使用";解包堆栈对象(如结构);如果让;_Optimization_Struct_Swift - Fatal编程技术网

Optimization 使用";解包堆栈对象(如结构);如果让;

Optimization 使用";解包堆栈对象(如结构);如果让;,optimization,struct,swift,Optimization,Struct,Swift,这是一个关于Swift可选堆栈对象(如struct)和“if let”的Swift编译器优化问题 在Swift中,“if-let”为您提供了一个语法糖,可以使用选项。 堆栈上的结构如何?作为C++程序员,我不会引入堆栈对象的不必要的拷贝,特别是,只是为了检查它是否存在于容器中。是否每次使用“if-let”时都会递归复制结构及其所有成员,或者swift编译器经过充分优化,可以通过引用或使用其他技巧创建局部变量 例如,我们将此结构打包为可选的: struct MyData{ var a=1

这是一个关于Swift可选堆栈对象(如struct)和“if let”的Swift编译器优化问题

在Swift中,“if-let”为您提供了一个语法糖,可以使用选项。 堆栈上的结构如何?作为C++程序员,我不会引入堆栈对象的不必要的拷贝,特别是,只是为了检查它是否存在于容器中。是否每次使用“if-let”时都会递归复制结构及其所有成员,或者swift编译器经过充分优化,可以通过引用或使用其他技巧创建局部变量

例如,我们将此结构打包为可选的:

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())
}
由于结构在堆栈上,要解包,是否存在从容器optionalData到本地var数据的不必要副本,或者数据是常量,副本被优化掉了

if let data=optionalData{//is data copy or reference?
    println(data.description())
}
编译器实际上不太可能发出代码来进行复制
let
本质上给表达式起了另一个名字

对于类,“let x=y”将允许您通过x的副本进行写入(因为您只是在复制引用),即

但对于structs,情况并非如此。不允许写入
let
struct或调用其上的任何
mutable
方法。这允许Swift编译器将x=y(其中y是一个结构)视为no-op

但是,此代码可能确实复制了
y

y.foo = bar
let x = y
y.foo = baz
x.foo // => bar
这是必须的,因为你写信给你抄袭的东西。这就是所谓的“写时复制”,这是一种优化,通过使用
let
语义实现

要回答您的最后一个问题:

if let data=optionalData{//is data copy or reference?
    println(data.description())
}
在这种情况下,数据无疑是一个参考。其实它可能根本就不存在,;编译器将发出与您编写的代码相同的代码:

if (optionalData != nil)
{    
    println(optionalData!.description())
}

复制两个整数是可笑的。获取引用可能非常“慢”,因为它无论如何都必须取消引用(从而“复制”)才能获取字段。这甚至是在考虑优化之前,优化应该很容易避免拷贝,也许完全避免堆栈(将字段存储在单独的寄存器中)。在基于一个天真的抽象机器而不是一个实际的计算机和编译器的合理模型的情况下,C++的专门知识对于性能估计几乎没有用。我们知道结构是在堆栈上(而不是堆内存)吗?SWIFT结构实例总是在堆栈上。