首页 > 解决方案 > 编译器如何证明内存安全?

问题描述

当我阅读Swift 编程语言:内存安全时,我对属性访问冲突部分感到困惑:

下面的代码显示,对存储在全局变量中的结构的属性的重叠写入访问会出现相同的错误。

var holly = Player(name: "Holly", health: 10, energy: 10)
balance(&holly.health, &holly.energy)  // Error 

在实践中,对结构属性的大多数访问都可以安全地重叠。例如,如果将holly上例中的变量更改为局部变量而不是全局变量,编译器可以证明对结构的存储属性的重叠访问是安全的:

func someFunction() {
    var oscar = Player(name: "Oscar", health: 10, energy: 10)
    balance(&oscar.health, &oscar.energy)  // OK 
}

在上面的示例中,Oscar 的健康和能量作为两个输入输出参数传递给balance(_:_:). 编译器可以证明保留了内存安全性,因为这两个存储的属性不会以任何方式交互。

编译器如何证明内存安全?

标签: iosswift

解决方案


这是因为多个线程。当“holly”是一个全局变量时,多个线程可以同时访问这个全局变量,你就有麻烦了。在局部变量的情况下,该变量在每次执行函数时存在一次。如果多个线程同时运行 someFunction(),每个线程都有自己的“oscar”变量,因此线程 1 的“oscar”变量不可能访问线程 2 的 oscar 变量。


推荐阅读