Swift 5将带来改进的Swift程序内存安全性,在程序的其他部分修改变量时,不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和Swift编译器本身都有重要影响。

Swift 5将带来改进的Swift程序内存安全性,在程序的其他部分修改变量时,不允许通过其他变量名来访问这些变量。这个变更对现有应用程序的行为和Swift编译器本身都有重要影响。

在多种情况下会发生独占内存访问问题。编译器可以静态地捕获大部分问题,剩下的只能在运行时处理。只能在运行时处理的问题包括具有转义闭包、类类型属性、静态属性和全局变量的排他性违规。

为了更好地说明这个问题,我们可以考虑一个相当普遍的情况:修改一个函数的inout变量,这个函数执行了一个闭包,这个闭包使用同一作用域内的两个不同的名称访问上述的变量:

func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) {  modifier(\u0026amp;value)  modifier(\u0026amp;value)}func testCount() {  var count = 1  modifyTwice(\u0026amp;count) { $0 += count }  print(count)}

在这个例子中,因为使用count同时作为modifyTwice和modifier的inout参数,所以出现了问题。我们不清楚print语句应该打印出什么内容。第一次count变量递增,它的值递增到2。但是,当执行第二次加法时,要添加到$0的count值是多少?这可能取决于很多因素,因为内存操作不一定是瞬时的。更糟糕的是,编译器可能会引入优化,进一步使这种情况复杂化。

这个问题不仅与通过不同变量名同时修改内存的不可预测性有关,也与编译器的复杂性有关。

这可能会导致意外和混乱的结果。它还导致编译器和标准库的实现具有很大的保守性,它们通常必须确保程序的基本可靠性(没有崩溃或未定义的行为),即使是在不寻常的情况下。

所有这些意味着如果发现独占访问冲突,使用Swift 5编译器编译的应用程序将在运行时崩溃。这个行为以前在Swift 4编译器调试模式下可用,因此,仅在运行时模式下测试过的程序在使用Swift 5编译时有崩溃的风险。

Swift 4编译器可用,因此仅在运行时模式下测试的程序在使用Swift 5编译时可能会崩溃。

修复访问独占违规的一般方法是复制数据。在我们的示例中,这将归结为:

func modifyTwice(_ value: inout Int, by modifier: (inout Int) -\u0026gt; ()) {  modifier(\u0026amp;value)  modifier(\u0026amp;value)}func testCount() {  var count = 1  let increment = count  modifyTwice(\u0026amp;count) { $0 += increment }  print(count)}

实际上,访问独占违规检查可能会被禁用,但强烈建议不要这样做:

虽然禁用运行时检查可能可以解决性能问题,但这并不意味着独占违规是安全的。如果没有启用强制执行,程序员必须遵守独占规则。

查看英文原文:
https://www.infoq.com/news/2019/02/swift-5-exclusive-memory-access

Swift 5将强制执行内存独占访问相关推荐

  1. c#强制执行内存回收

    [DllImport("psapi.dll")] private static extern int EmptyWorkingSet(int hProcess);GC.Collec ...

  2. ARM平台下独占访问指令LDREX和STREX的原理与使用详解

    为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁.为了实现所谓的互斥锁的概念,一般都需要所在平台提供支持. 在计算机领域里,如果要在多线程的情况下要 ...

  3. 内存位置访问无效_万字长文——java内存模型之volatile深入解读

    在阅读本文前,请思考以下的面试题? volatile是什么? volatile的特性 volatile是如何保证可见性的? volatile是如何保证有序性的? volatile可以保证原子性吗? 使 ...

  4. AXI 独占访问(Exclusive)和锁定访问(Locked )机制

    本文讲解AXI协议中的独占访问和锁定访问机制. AXI中使用 ARLOCK或 AWLOCK信号的编码来表示普通访问.独占访问和锁定访问,这里我们用AxLOCK代指. 独占访问(Exclusive ac ...

  5. linux强制执行当前命令,Linux | 常用命令(一)

    整理了一下linux常用命令,方便大家使用和学习. 一.文件处理命令 1.命令格式与目录处理命令 ls –a[查看隐藏文件] ls –l[查看文件信息长格式显示] ls –d[查看指定目录的详细信息] ...

  6. 如何正确强制执行Git推送?

    我已经建立了一个远程的非裸露的"主"仓库,并将其克隆到我的计算机上. 我进行了一些本地更改,更新了本地存储库,然后将更改推回到远程仓库中. 到那时为止一切都很好. 现在,我不得不更 ...

  7. zz[as3 hack技术]垃圾回收机强制执行

    此文为MoonSpirit文章 原文http://www.actionscript3.cn/bbs/thread-234-1-1.html ------------------------------ ...

  8. 内存位置访问无效 midas.dll_内存虚拟化介绍

    本文以Intel开源的ACRN项目(Homepage - Project ACRN™)介绍的内存虚拟化技术为基础,介绍一下在虚拟系统中内存管理的一些基本知识.另外不同虚拟化公司提供的技术大多基于开源项 ...

  9. oracle强制执行计划,OBA技能2-Oracle执行计划顺序表连接

    小仙我在学习索引执行行为的时候,有个疑惑?那就是索引是找到一个值就马上回表,然后再找下一个值,再回表. 比如索引唯一扫描,索引范围扫描,索引全扫描,索引快速扫描.好像都是要回表.尤其是范围,不范围完后 ...

最新文章

  1. 判断是不是一个数组?
  2. 常见加密算法分类,用途,原理以及比较
  3. 项目: 双人反弹球游戏
  4. JZOJ 2256. 【BZOJ 2256】【ZJOI 2008】树的统计
  5. mysql1215_MySQL全面瓦解15:视图
  6. python右对齐输出如果结果超过30个字符_Python3 输出字符串左对齐、右对齐、居中对齐...
  7. 电脑重新分区扩大c盘_两种方法,给电脑C盘增加10G的容量,电脑焕然一新
  8. CS144 lab4 计算机网络实验 笔记
  9. leetcode359. 日志速率限制器
  10. 资源放送丨《MySQL故障诊断常用方法手册》PPT视频
  11. JAVA(-Xms,Xmx,Xmn-XX:newSize,-XX:MaxnewSize,-XX:PermSize,-XX:MaxPermSize)区别
  12. 2.maven 安装配置
  13. ubuntu GIT 安装与使用
  14. Spring MVC的流程
  15. 这个情人节,工程师用阿里云来试着表达不一样的爱意 1
  16. ios 添加block 类别_ios block是什么数据类型?
  17. php jmail 乱码,Jmail发送邮件与带附件乱码解决办法分享
  18. 闲人闲谈PS之十五——合同、项目、WBS的关系
  19. 级数ex展开_泰勒级数的若干展开方法
  20. java 调用阿里云中通快递查询示例

热门文章

  1. solr 英文模拟mysql like查询xml_Solr之精确、匹配、排序、模糊查询-yellowcong
  2. sql 减法_SQL学习笔记整理(持更)
  3. vs 调试 无法加载自定义可视化工具_推荐 5 款好用的REST API工具
  4. 【年终总结】有三AI至今在人脸图像算法领域都分享了哪些内容?
  5. 如何跟随有三从零进阶中级CV算法工程师
  6. 【NLP】 聊聊NLP中的attention机制
  7. 【NLP】用于序列标注问题的条件随机场(Conditional Random Field, CRF)
  8. 【模型解读】GoogLeNet中的inception结构,你看懂了吗
  9. 全球与中国压延铜箔市场发展调研及投资前景战略建议报告2022-2028年版
  10. COM 组件设计与应用(十一)—— IDispatch 及双接口的调用