【发布时间】:2021-07-20 09:53:16
【问题描述】:
当我阅读Swift 编程语言:内存安全时,我被 Conflicting Access to Properties 部分弄糊涂了:
下面的代码显示重叠写入出现相同的错误 访问存储在全局中的结构的属性 变量。
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(_:_:)。编译器可以证明内存 安全性得以保留,因为两个存储的属性不交互 以任何方式。
编译器如何证明内存安全?
【问题讨论】:
-
我经常从相反的角度想知道同样的问题,即为什么不能编译器在第一个示例中证明内存安全。当然,编译器知道全局变量和局部变量的内存布局,并且应该能够查看
health和energy属性在任何一种情况下是否相互别名。我有一些猜测,但不是一个实际的答案。好问题。 -
虽然这是一个有趣的问题,但我认为 SO 不是正确的论坛。我建议你在Swift forums 中提问,在那里你可以找到更熟悉编译器功能的专家。
-
还在 Swift 论坛上创建了a topic。