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
完成后,两个代码都会让你的系统处于相同的状态吗?
答案 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”,以便进行优化。如果您关心这种级别的优化,则需要习惯于读取该输出,以便查看实际运行的代码。