一段有趣的代码之 swift 6 对于内存访问优化
早上躺在床上挣扎起床, 拿起手机刷完邮件, 和工作IM之后忍不住打开了X. 看到一个tweet https://x.com/Lakr233/status/1972677999729512858. 看了下, 随口说出了答案是200. 但是 @Lakr233 说他这个问题另有深意. 所以赶紧起床研究问题.
我开始尝试关闭编译器优化, 重新编译运行. 同样能正常运行, 没有报Simultaneous access
的运行时错误.
为了对的起我的起床, 我决定深入研究一下. 我先简化代码, 然后阅读汇编代码.
通过上图, 可以看到take
方法的调用在swift_beginsAccess
与 swift_endAccess
之间, 说明swift确实检查了内存安全. 但是它只检查了一次, 并没有针对第8行的闭包和take方法分别检查, 所以我的程序能过正常运行.
对了, swift_beginsAccess 方法会对访问内容进行检查, 如果都是读取操作不会有问题, 如果针对某个地址还有其它操作就会报运行时错误.