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++内存管理非常复杂,如果完全地系统地介绍可 ...
随机推荐
- Vue指令的概念
指令(Directives) 是带有v- 前缀的特殊属性,指令属性是单一的js表达式. 指令的职责就是表达式的值发生变化时,在DOM中做出相应的回应. 如下例子: 实例 <div id=&quo ...
- CAD实现文档坐标到视区坐标的转换(com接口Delphi语言)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...
- Java实现打包文件
把文件打包到压缩包里 public void zip (String... files) throws IOException { //创建文件打包流对象 ZipOutputStream zos = ...
- RC: blkio throttle 测试
本文将测试一下使用cgroup的blkio组来控制IO吞吐量 : 测试环境CentOS 7.x x64 创建一个继承组 [root@150 rg1]# cd /sys/fs/cgroup/blkio/ ...
- vue的路由配置
路由,其实就是指向的意思,当我点击页面上的home按钮时,页面中就要显示home的内容,如果点击页面上的about 按钮,页面中就要显示about 的内容.Home按钮 => home 内容, ...
- MYEclipse Available Memory is low 警告 解决方法
1, 设置Eclipse内存使用情况 修改eclipse根目录下的eclipse.ini文件 -vmargs //虚拟机设置 -Xms40m -Xmx256m -XX:PermSize=128M ...
- Luogu P4016 「 网络流 24 题 」负载平衡问题
吐槽题目难度,这个题建模好像比前两个都要难,但是难度评级却比第二个要低. 解题思路 依旧是考虑如何建模和建立源点汇点.每个点的货物数量到最后都一样的话肯定是等于他们的平均值.用 $num$ 数组存储原 ...
- POJ3616 Milking Time【dp】
Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her producti ...
- Linux下挂载新磁盘
Linux的硬盘识别: 一般使用”fdisk -l”命令可以列出系统中当前连接的硬盘 设备和分区信息.新硬盘没有分区信息,则只显示硬盘大小信息. 1.关闭服务器加上新硬盘 2.启动服务器,以r ...
- i2c中start和restart的区别
有的硬件芯片提供了一个个寄存器,供我们很好的操作i2c,但是,在用的时候,我们是不知道他到地是怎么操作的,下边,我就探讨下i2c中的start和restart的区别. start是在scl是高电平的时 ...