ios - 编译器如何证明内存安全?
问题描述
当我阅读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(_:_:)
. 编译器可以证明保留了内存安全性,因为这两个存储的属性不会以任何方式交互。
编译器如何证明内存安全?
解决方案
这是因为多个线程。当“holly”是一个全局变量时,多个线程可以同时访问这个全局变量,你就有麻烦了。在局部变量的情况下,该变量在每次执行函数时存在一次。如果多个线程同时运行 someFunction(),每个线程都有自己的“oscar”变量,因此线程 1 的“oscar”变量不可能访问线程 2 的 oscar 变量。
推荐阅读
- chef-infra - 使用 chef-client 维护文件内容
- azure-devops - 对用户隐藏项目列表中的团队?
- elasticsearch - 需要 ElasticSearch 聚合帮助
- jquery - jquery动态添加textarea并监听输入事件
- r - 如何关闭在 Plotly 中显示我所有数据的工具提示?
- java - 如何打开网页并点击元素?
- flex-lexer - 如何为同一文本调用多个词法分析器?
- android - 是否可以更改 apk 的签名?
- typescript - TypeScript如何为空数组定义元组类型?
- c# - 将图像上传到 azure blob 存储 - 在本地工作,部署时失败