我一直在快速学习,遇到了一个关于内存安全的问题。+=
运算符在左侧接受一个参数,该inout
参数应该对整个函数调用具有写访问权限。left = right+left
它在其实现中做了类似的事情。它似乎是写入和读取访问的重叠。这怎么不违反内存安全?
编辑:根据The Swift Programming Language,它可以在一个线程中发生:
但是,这里讨论的冲突访问可能发生在单个线程上,不涉及并发或多线程代码。
详细说明:这里有两个来自The Swift Programming Language (Swift 4.1 beta) 的例子。我很困惑+=
结构中的这种自定义实现如何Vector2D
正常:
static func += (left: inout Vector2D, right: Vector2D) {
left = left + right
}
当这不是:
var stepSize = 1
func incrementInPlace(_ number: inout Int) {
number += stepSize
}
incrementInPlace(&stepSize)
// Error: conflicting accesses to stepSize
进一步编辑:
我认为我的问题确实是 += 作为一个函数,特别是在使用时
stepSize += stepSize
或使用自定义实现:
var vector = Vector2D(x: 3.0, y: 1.0)
vector += vector
这没有任何错误。但是 func 从左侧获取一个 inout,因此对“step”具有长期写入访问权限,那么如果右侧也传入“step”,我很困惑这不是“step”的即时读取访问”与“步”的长期书写重叠。或者,当您为两个 inout 参数传入同一个实例时,这只是一个问题,而不是一个 inout 和一个常规参数?