【问题标题】:Why does a function have long-term write access to all of its in-out parameters?为什么一个函数对其所有输入输出参数都有长期写入权限?
【发布时间】:2019-01-28 02:55:48
【问题描述】:

根据 Swift Programming Language Guide (for Swift 4.2) 中的“内存安全”一章,有一句“A function has long-term write access to all its in-out parameters”。 https://docs.swift.org/swift-book/LanguageGuide/MemorySafety.html

我创建了一个新的命令行工具项目来在 Xcode 10.1 中验证它。

var stepSize = 1

func increment(_ number: inout Int) {
  print(stepSize)
}

increment(&stepSize)

我希望输出为 1,但实际输出的是崩溃日志“同时访问 0x100587430,但修改需要独占访问”。

我知道这是关于访问 in-out 参数的冲突,但我不知道为什么会发生这种情况。为什么一个函数对其所有输入输出参数都有长期写入权限?

【问题讨论】:

  • “in-out 参数的写访问 [...] 持续该函数调用的整个持续时间” 你是说你希望写访问在函数返回之前结束?
  • 为什么单线程swift会出现内存冲突?我从未听说过 javascript 中的内存冲突
  • 查看 WWDC 2018 What’s New in Swift 中关于内存排他性检查的讨论。

标签: swift memory-safety


【解决方案1】:

此 API 的使用者看到 func increment(_ number: inout Int),但看不到实现。它只能假设increment(_:) 写入参数,因为它可以,原则上。

即使函数实现当前没有进行任何写入,也有可能,因此编译器必须假设最坏的情况。想象一下,如果允许一些客户端代码对此进行编译,则将其视为只读(因为当时可能是这种情况)。当有人将number += 1 添加到函数体时,客户端代码会发生什么?

这类似于拥有一个声明它可以throw 的函数,其实际实现不是throw。编译器仍然将其视为抛出,并且需要使用 try 的某些变体来处理错误。

【讨论】:

    猜你喜欢
    • 2020-01-18
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    相关资源
    最近更新 更多