内存访问冲突

2019-09-25  本文已影响0人  纳兰沫

内存访问冲突会在两个访问满足下列条件时发生

1.至少一个是写入操作
2.他们访问的是同一块内存
3.他们的访问时间重叠(比如在同一个函数内)
不存在内存访问冲突
//不存在内存访问冲突
func plus(_ num: inout Int) -> Int {
    return num + 1
}
var number = 1
number = plus(&number)
存在内存访问冲突
var step = 1
func increment(_ num: inout Int) {
    num += step
}
increment(&step)
func balance(_ x: inout Int, _ y: inout Int) {
    let sum = x + y
    x = sum / 2
    y = sum - x
}

var num1 = 42
var num2 = 30
balance(&num1, &num2)
balance(&num1, &num1)
错误信息.png
解决内存访问冲突
var step = 1
func increment(_ num: inout Int) {
    num += step
}
var copyOfStep = step
increment(&copyOfStep)
step = copyOfStep

如果下面的条件可以满足,说明重叠访问结构体的属性是安全的

- 只访问实例存储属性 不是计算属性或者类属性
- 结构体是局部变量而非全局变量
- 结构体要么没有被闭包捕获要么只被非逃逸闭包捕获
上一篇 下一篇

猜你喜欢

热点阅读