当我阅读Swift编程语言:内存安全时,我对对属性的冲突访问一节感到困惑
下面的代码显示,对于存储在全局变量中的结构的属性的重叠写入访问,也会出现相同的错误。 变量holly =Player(名称:"Holly",健康: 10,能量: 10) balance(&holly.health,&holly.energy) //错误 实际上,大多数对结构属性的访问都可以安全地重叠。例如,如果上面示例中的变量
holly被更改为局部变量而不是全局变量,编译器可以证明对存储的结构属性的重叠访问是安全的: someFunction() { var oscar =Player(名称:"Oscar",健康: 10,能量: 10) balance(&oscar.health,&oscar.energy) // OK } 在上面的例子中,Oscar的健康和能量作为两个输入输出参数传递给balance(_:_:)。编译器可以证明内存安全是保持的,因为这两个存储的属性不以任何方式交互。
编译器如何才能证明内存的安全性?
发布于 2021-07-18 14:09:01
在函数作用域中,编译器可以确定将在struct上执行哪些操作以及何时执行操作。编译器知道structs是如何工作的,以及如何和何时(相对于调用函数的时间)执行函数中的代码。
在全局或更大的范围内,编译器将失去对可能修改内存的内容以及何时修改内存的可见性,因此无法保证安全性。
发布于 2021-07-20 01:53:16
Andrew_Trick on Swift论坛的回答
“不要互动”是一个强有力的声明。编译器只需检查调用“balance”中对“oscar”的每次访问都只能修改独立的内存块(“健康”与“能量”)。这是一个特例,因为对结构的任何访问通常被建模为对整个struct值的读/写。编译器需要做一些额外的工作来检测和允许这种特殊情况,因为在这种情况下复制“oscar”结构是不方便的。
https://stackoverflow.com/questions/68429581
复制相似问题