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++内存管理非常复杂,如果完全地系统地介绍可 ...
随机推荐
- CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度
1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...
- Crash reporter
A crash reporter is a software application whose function is to identify report crash details and to ...
- Java基础(十)--static关键字
static关键字通常应用在字段.方法.静态块,还有冷门一点的内容:静态内部类.静态导入 static字段: static字段也就是静态变量,是属于类的,被所有的对象所共享,只有当类初次加载的时候保存 ...
- js读写txt文件
view plain<script language="javascript" type="text/javascript"> //读文件funct ...
- (独孤九剑)---PHP操作MySQL数据库
[一]开启mysql扩展 在PHP操作MySQL数据库之前,要保证开启了MySQL数据库扩展 若未开启,则可以将php.int文件下的php_mysql开启即可,方式为去掉前面的封号; 配置完成后要重 ...
- vue中websoket的使用
首先安装npm install --save websocket-heartbeat-js@^1.0.7 在main.js中 引入并挂载全局方法 import WebsocketHeartbeat ...
- Python学习-算术运算符,赋值运算符和复合运算符
算术运算符 常见的算术运算符有 : + 加法运算符 print(1 + 2); // 3 print('1' + '2'); //12 不仅可以进行2个数字的相加,还可以连接2个字符串 - ...
- python3接口测试某个模块的很多接口有的用post有的用get
没啥好说的,啊哈哈 大神提示可以判断下用post还是get,但是加到哪里合适呢?仔细看认真看 耶耶耶
- 【Python实践-8】和为S的两个数字
(剑指offer)输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 思路:选定第一个数字,然后遍历后面的数字求和并与S比 ...
- java属性的默认值
String 默认null Boolean默认false int默认0 double默认0.0 类中使用自定义类定义属性默认值:null 在定义属性的时候可以指定默认值