Delphi中ARC内存管理的方向
随着即将发布的10.3版本,RAD Studio R&D和PM团队正在制作Delphi在内存管理方面的新方向。
几年前,当Embarcadero开始为Windows以外的平台构建新的Delphi编译器时,就核心语言功能和语言的整体感知而言,有很多讨论新Delphi与当前语言的兼容性。最终出现的决定是保持极高程度的兼容性,并采用一些重要而大胆的步骤来实现更能吸引新一代开发人员的语言。
什么是自动参考计数?
(具有弱引用的交叉链接对象)
其中一个变化就是决定采用新的移动平台内存管理模式,遵循Apple已经推出的iOS内存模式:自动引用计数或ARC。在使用垃圾收集的移动电话这样的内存受限设备上通常被认为是一个问题(因为您最终消耗的内存比严格需要的内存多,并且还会影响电池寿命)并且ARC提供了简化的内存管理模型,更易于使用在简单的场景中,完全确定性和健壮性。
这就是为什么Delphi选择相同的模型,扩展对象引用计数模型已经可用于接口很长一段时间了,使得它更强大的弱和不安全的引用,并将其扩展为普通的对象变量。该模型确实提供了一些显着的优势,其中一个最初的想法是在所有平台上将其扩展为Delphi语言。
ARC缺点
(缠绕弱和强引用)
在计划推出几年后,我们仍然看到它的优势和好处,但我们对ARC模型的缺点以及它在Windows和VCL应用程序中使其成为默认值的效果更加清晰。 。
我们长期以来一直认为ARC内存管理是对传统Delphi模型的改进,因为它消除并简化了一些内存管理。但是,我们在构建和维护大型库时,以及在复杂的代码库上与客户交谈时已经学到了这一点,虽然ARC在纸上看起来很棒,对于局部变量和更简单的场景,但它往往会给复杂场景带来很多麻烦。我们所有库的TComponent所有权模型都与ARC不一致,使得支持ARC的现有组件库变得复杂。
我们本可以决定在Windows上使用“完全ARC”,但这会导致现有应用程序和组件的严重破坏,造成比我们过去的Unicode迁移更多的麻烦 - 这是由于外部压力造成的提供良好的国际支持以及底层操作系统(从Windows开始)也是Unicode的事实。
我们有许多要求使ARC成为可选项,但是一个启用ARC的对象不会轻易与非启用ARC的对象共存,我们需要两种对象的容器,并且无法混合它们。这最终将成为一个非常复杂的场景。混合ARC和非ARC不是一个可行的解决方案,但是在不同平台上保持不同的内存模型最终会击败“单一来源,多平台”的整个想法,这是当今Delphi服务器端的核心原则(Windows和Linux)和所有平台上的客户端站点都可以构建FireMonkey应用程序。
另一个重要的角度是ARC具有运行时成本。虽然可以对事物进行优化和改进,但最终自动管理并非完全免费。虽然垃圾收集在开始时具有(非常高的)成本,但ARC在对象生命周期和对象交互方面有成本(除非您小心地将const用于所有参数传递)。禁用ARC的积极效果是可衡量的性能改进。最后,Delphi中的ARC与产品的C ++方面有点不一致,后者是RAD Studio不可或缺的一部分。
新计划:逐步淘汰ARC
(在Delphi中使用接口)
考虑到所有这些因素,经过广泛的内部讨论,还涉及合作伙伴和外部开发人员,我们得出的结论是,最好的方法是将ARC模型作为默认的内存管理解决方案,并弥补其损失与其他选择。
实际上,10.3 Rio版本中的Linux 64位编译器将提供Windows平台的传统Delphi内存管理,使您的Windows和Linux服务器端代码完全等效 - 至少在Delphi语言和内存方面管理。
前进的计划是不接受ARC用于即将推出的macOS 64位平台(因此所有桌面平台都将保留在非ARC模型上)并且将来也禁用ARC用于移动平台(很可能是在10.3)之后的下一个主要版本。请注意,在10.3 Rio中,移动编译器仍然启用了ARC,与10.2完全相同。
现代记忆管理还有什么?
(来源:https://pixabay.com/photo-1751201/)
我们仍然认为引用计数内存管理是相关的,但我们更愿意利用和扩充Delphi中接口和字符串使用的现有引用计数模型,而不是为它引入新机制。这种情况已经存在了很长时间。如果处理不当,接口引用和对同一对象的对象引用会引起麻烦,但这是大多数Delphi开发人员已经知道如何处理的问题,并且有很多关于该主题的文档。
最近使用弱引用甚至不安全的引用扩展了接口引用。这些附加选项大大增加了“ARC for interfaces”的功能和灵活性。换句话说,虽然我们要删除ARC以进行对象引用,但是用于接口引用的ARC是已经并将继续可用的语言的一个特性。
除此之外,我们希望改进和简化具有堆栈引用的本地短期对象的生命周期(和内存管理)的管理。这是我们将在10.3中引入的一个非功能,但我们正在积极研究这些功能,并且可以由开发人员利用托管记录(10.3中的新语言功能)部分实现。
包起来
(内存泄漏跟踪变得简单)
虽然我们知道几年前对计划的这种改变可能会令人惊讶并影响现有代码,开发人员对ARC模型不满意,支持不同平台上的多个模型,以及与本机内存管理相比性能损失,很可能会欣赏这个决定。
提供进一步简化Delphi内存管理的替代方法是在RAD Studio的路线图中,但当前的一组功能(具有引用计数和支持弱和不安全引用,组件所有权模型和标准通用实践的接口)已经提供了一个很好的框架减少Delphi开发人员对手动内存管理的担忧。
最终,编程语言中没有完美的内存管理解决方案,因为自动编程语言有其缺点,而手动编程语言(手动)也是如此。德尔福在过去一直保持着良好的平衡,这种平衡今天仍在继续,并且将来只会有所改善。
Delphi中ARC内存管理的方向的更多相关文章
- C++中的内存管理
在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存 ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...
- iOS阶段学习第21天笔记(ARC内存管理-Copy-代理)
iOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引 ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- IOS ARC内存管理,提高效率避免内存泄露
本文转载至 http://blog.csdn.net/allison162004/article/details/38756263 Cocoa内存管理机制 (1)当你使用new.alloc.copy方 ...
- iOS-OC的MRC和ARC内存管理机制
1. Objective-c语言中的MRC(MannulReference Counting) 在MRC的内存管理模式下,对变量的管理相关的方法有:retain,release和autorelease ...
- Unity游戏开发中的内存管理_资料
内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.c ...
- cocos2dx中的内存管理机制及引用计数
1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时, ...
- Cocos2d-x开发中C++内存管理
由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可 ...
随机推荐
- jQuery.treetable使用及异步加载
Usage 1 GitHub 地址 https://github.com/ludo/jquery-treetable/ 2 API 地址 http://ludo.cubicphuse.nl/jquer ...
- 自定义 Java Annotation ,读取注解值
1. 首先是自定义注解: package cn.veji.hibernate.po; import java.lang.annotation.ElementType; import java.lang ...
- 通过acdbblockreference 获得块名
AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(ent.object()); AcDbObjectId pBlkTblRecId; ...
- java学习_5_23
Collection接口中定义的方法如下,所有继承自Collection接口的接口(List,Set)的实现类均实现了这些方法. List容器是有序.可重复的,常用的实现类:ArrayList,Lin ...
- java Object类中方法介绍
- vue基础---事件处理
(1)事件监听 v-on 指令监听 DOM 事件,并在触发时运行JS代码 <div class="event_area"> {{message}} <button ...
- 用meta name="renderer" content="webkit|ie-comp|ie-stand"来切换360双核安全浏览器的极速模式和兼容模式
以下信息摘自360官方网站: 浏览模式:极速模式.兼容模式及IE9高速模式是360浏览器显示网页时使用的三种模式:极速模式表示极速模式兼容模式表示兼容模式IE9IE10模式表示IE9/IE10模式(仅 ...
- ubuntu 14.04 挂载window共享目录
(1) 先在ubuntu系统里,新建一个目录用于挂载,目录假设为 /mnt/win: sudo mkdir /mnt/win (2)在windows系统,共享出一个文件夹,共享名称假设为www sud ...
- python 配置文件 ConfigParser模块
ConfigParser模块 用于生成和修改常见配置文档,当前模块的名称在 python 3.x 版本中变更为 configparser. 来看一个好多软件的常见文档格式如下 [DEFAULT] Se ...
- 洛谷 4216 BZOJ 4448 [SCOI2015]情报传递
[题解] 每个情报员的危险值val[i]应该是一个分段函数,前面一段是平行于x轴的横线,后面一段是一次函数.我们可以用fx(t)=t-b[x]表示这个一次函数.每次询问一条链上fx(t)大于c的点的个 ...