50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

Swift 内存所有权宣言

  • 2017-03-07
  • 本文字数:1252 字

    阅读完需:约 4 分钟

根据 Chris Lattner 介绍,Swift 4 的主要目标之一就是要定义一个类似于 Rust/Cyclone 的内存所有权模型(Memory Ownership Model)。Chris Lattner 是 Swift 的创建者,在跳槽到Tesla 之前曾担任Swift 团队负责人。在Swift 4 当前已进入第二阶段的情况下,Swift 团队发布了一个宣言,详细阐明了Swift 内存所有权的工作方式。

Swift 编译器为确定所有权转换的时机,已实现了一种自己的不透明所有权模型(即 ARC )。虽然所有权在一些情况下是很明晰的,但是编译器也会在一些情况下做出错误假设,进而导致不必要的复制。简而言之,Swift 的新内存所有权模型使得内存复制尽可能地处于开发人员的控制之下。定义该模型在于尽量克服当前写时复制(copy-on-write)在引用计数方法上的不足之处,包括:引用计数的开销及性能偶尔无法预测,以及为实现随时可复制的需求而笼统地分配堆内存。

虽然这些缺点通常对于应用编程并不会构成问题,但是对于那些需要一定性能保证的系统编程而言却不受欢迎。此外,更灵活的内存管理模型具有显著优点,这些优点同样适用于应用编程,去解决特定瓶颈问题的优化。基于上述原因,与 ARC 相比,选取 Swift 的新内存所有权模型无疑会更具优势,只有那些对更细化控制有需求的开发人员才需要承担模型的复杂性代价。

“独占性原则”(Law of Exclusivity)会影响到所有的 Swift 开发人员,这一更改并非可选择添加的。它强制变量不能以冲突的方式同时访问,典型情况包括变量作为inout参数传入两个不同函数,以及方法所接收的回调访问了方法所调用的同一变量。这两种情况当前在 Swift 中是允许的,移除他们无疑将会影响到所有的开发人员。此外,独占性原则会更改对参数所做的保证,进而影响到语言的应用二进制接口(ABI),因此它会成为被率先采用的特性之一。

除了独占性原则之外,Swift 还将引入新的标注和语言特性,允许传递共享值以及表达无法隐式复制的类型。宣言的作者指出。在独占性、显示控制共享值传递和不可复制类型这三种机制的共同作用下,编译器可以对代码做更好的优化。

简而言之,可以将新 Swift 所有权模型的高层愿景概括如下:

  • 如上所述,编译器将会标注所有非独占性使用的inout参数,无论是显式的还是隐式的。
  • 开发人员将可以定义一个变量是具有所有权的还是共享的,以避免在进入或离开词法作用域时引用计数和做不必要的拷贝 / 销毁。
  • 开发人员将可以定义moveonly(即不可拷贝)类型,该类型对编译器不可复制,也不能用于创建更多的引用。moveonly类型具有 move 语义,被认为是一种高级特性。除此以外,所有类型将默认是可复制的。

宣言中为这一所有权模型定义所赋予 Swift 的全部特性给出了长篇的和详细的分析,宣言的细节内容仍非最终版本。Swift 开发人员 Alexis Beingessner发布了一篇更简短的文档,扼要地概括了宣言的要点。

查看英文原文: Swift Memory Ownership Manifesto


感谢张卫滨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-03-07 18:002438
用户头像

发布了 227 篇内容, 共 85.0 次阅读, 收获喜欢 28 次。

关注

评论

发布
暂无评论
发现更多内容

基于CC2530设计的智能风扇

DS小龙哥

2月月更 智能风扇

学生管理系统的架构设计

凌波微步

「架构实战营」

大厂偏爱的Agent技术究竟是个啥

捉虫大师

架构 agent

CSS实现阮大佬博文的阅读进度功能

战场小包

CSS css3 前端 2月月更

eBPF 完美搭档:连接云原生网络的 Cilium

火山引擎边缘云

边缘计算 ebpf 云原生网络 cllium

关于MVVM和MVC,面试看这篇就够了

山河已无恙

mvc 全栈 MVVM 2月月更

Nginx跨域解决配置示例

nginx 跨域

面试突击25:sleep和wait有什么区别?

王磊

java面试

Pulsar 职位广场 | 腾讯、华为云、虾皮、众安保险、StreamNative 等多个热招岗位

Apache Pulsar

开源 架构 云原生 招聘 Apache Pulsar

学生管理系统的架构文档

卡西毛豆静爸

「架构实战营」

开源| 直播推拉流2.0升级了什么

anyRTC开发者

开源 音视频 屏幕共享 视频直播 美颜滤镜

上海市宝山区委书记陈杰一行参访旺链科技

旺链科技

区块链 产业区块链 Vone新闻

UMEM:友盟统计自定义事件多应用一键同步 & 批处理工具

SamgeApp

Docker Vue 友盟助手 友盟自定义事件批处理 友盟统计

数据库读写分离如何保证主从一致性?

蜜糖的代码注释

MySQL 数据库 2月月更

用简单例子带你了解联合索引查询原理及生效规则

华为云开发者联盟

sql 索引 查询 联合索引

盘一盘常见的6种索引失效情况

华为云开发者联盟

MySQL 索引 字符串 查询 索引失效

十年所学,梦想终至,不负时光 | 《云端架构》新书首推发布,来自极度努力的吕校长

博文视点Broadview

VIPKID基于Karmada的容器PaaS平台落地实践

华为云原生团队

开源 Kubernetes k8s多集群管理 混合云 分布式云

80%的软件环境管理问题,根因都在这里 | 研发效能提升36计

阿里云云效

阿里云 DevOps 云原生 持续交付 部署

[Python]第一章(建议收藏)

謓泽

Python 2月月更

OpenHarmony移植案例与原理:如何适配服务启动引导部件bootstrap_lite

华为云开发者联盟

OpenHarmony 移植 bootstrap_lite startup 系统服务

学生管理系统架构设计文档

阿卷

架构实战营

ko在数栈中的应用

袋鼠云数栈

[Python]介绍

謓泽

Python 2月月更

凡泰极客成为W3C成员并加入MiniApps工作组,将积极参与小程序快应用技术标准化进程

FinClip

小程序

Python 中的数组哪去了?

宇宙之一粟

Python 数组 2月月更

C++异常处理机制

正向成长

c++ 异常处理

工作想法小计(2):2/14 - 2/18

非晓为骁

个人成长

好用不卡,这些插件和配置让你的 Webstorm 更牛逼!

前端下午茶

前端 工具 webstorm

如何打造一个能自动回复的钉钉机器人

老表

Python 机器人 Linxu 跟老表学云服务器

Swift内存所有权宣言_开源_Sergio De Simone_InfoQ精选文章