本地"会发生什么? var表达后?

时间:2015-05-05 21:06:32

标签: swift local var

注意:"本地"含义在{}

localVar表达后func会发生什么?

var constantVarHolder = Int()

func NameOfFunc(){
    var localVar = Int()
    if X = 0 {
        localVar = 3
    }
    else {
        localVar = 4
    }
    constantVarHolder = localVar
}

它是否会被取消初始化,因为不再使用任何内存或CPU?

据我所知,如果我将代码更改为..

var singleVar = Int()

func NameOfFunc() {
    if X = 0 {
        singleVar = 3
    }
    else {
        singleVar = 4
    }
}

..会在func的表达期间加快时间和内存使用。

但是func完成后,两个代码都会让你的系统处于相同的状态吗?

1 个答案:

答案 0 :(得分:2)

你的第一个例子没有做你期望它做的事情(你是影子localVar)。但我认为你真的是这个意思:

var constantVarHolder = Int()

func NameOfFunc(){
    var localVar = Int()
    if X = 0 {
       localVar = 3
    }
    else {
        localVar = 4
    }
    constantVarHolder = localVar
}

简短的回答是,优化器可以自由地以逻辑相同的方式重写代码,因此您断言第二个版本比第一个版本更快(正如我给出的那样)是不正确的。它们很容易相同。编译器可以自由地将本地变量分配给寄存器,因此可能根本没有RAM使用。在任何情况下,这些变量都将存储在堆栈中,但这种情况确实无关紧要。

关于“CPU”的问题根本没有意义。变量不使用CPU时间。计算确实。

“让你的系统处于相同的状态”是一个过于宽泛的术语。几乎可以肯定,州在某种程度上会有所不同。但是,是的,全局变量在任何一种情况下都会具有相同的值(假设您按照我提供的方式编写代码),并且所有局部变量都将被释放(如果它们存在,则不太可能)。

很难想象这个问题有用的案例。即使优化器没有删除本地堆栈变量,将立即值移动到堆栈然后从堆栈复制到RAM的任何微小时间差都与首先调用函数的成本相比相形见绌(假设它不是内联)。如果你真的想加速这个功能,你就会以完全错误的方式看待它。

那就是说,回答问题的方法是看装配输出。在Xcode中,打开Assistant Editor,选择“Assembly”,然后选择底部的“Profile”或“Release”,以便进行优化。如果您关心这种级别的优化,则需要习惯于读取该输出,以便查看实际运行的代码。