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开发人员对手动内存管理的担忧。

最终,编程语言中没有完美的内存管理解决方案,因为自动编程语言有其缺点,而手动编程语言(手动)也是如此。德尔福在过去一直保持着良好的平衡,这种平衡今天仍在继续,并且将来只会有所改善。

http://blog.marcocantu.com/blog/2018-october-Delphi-ARC-directions.html

原文地址:https://www.cnblogs.com/findumars/p/9864127.html

时间: 2024-10-08 03:36:23

Delphi中ARC内存管理的方向的相关文章

OC的MRC和ARC内存管理机制注意:Xcode4以前没有ARC。

1. Objective-c语言中的MRC(MannulReference Counting) 在MRC的内存管理模式下,对变量的管理相关的方法有:retain,release和autorelease.retain和release方法操作的是引用记数器,当引用记数为零时,便自动释放内存.并且可以用NSAutoreleasePool对象,对加入自动释放池(autorelease调用)的变量进行管理,当drain时回收内存. (1)retain,该方法的作用是将内存数据的所有权附给另一指针变量,引用

IOS阶段学习第21天笔记(ARC内存管理-Copy-代理)

IOS学习(OC语言)知识点整理 一.OC 中的ARC内存管理 1)ARC中释放对象的内存原则:看这个对象有没有强引用指向它 2)strong:强引用,默认情况下的引用都是强引用 3) weak:弱引用__weak 4)ARC环境下:与内存相关的代码都不能使用了,如果要在ARC环境下使用MRC内存管理代码 如: [super    delloc]  选中项目找到 Build Phases 菜单下的  Compile Sources 项 选中要转换的.m文件, 双击写入此行代码:-fno-objc

C++中的内存管理

在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存泄露.所以我们要学会内存管理,不要内存泄露.在C++中的内存管理机制和OC中的还不太一样,在OC中的ARC机制会给程序员的内存管理省不少事,但在C++中没有ARC所以我们要自己管理好自己开辟的内存.Java中也有自己相应的内存管理机制,比如JDBC里的获取的各种资源在finally里进行close等

ARC内存管理机制详解

ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数.有自动引用计数,那么就得有手动引用计数MRC(Mannul Reference Counting),前面已经提到过了MRC.那么在ARC模式下是不是意味着我们就可以一点也不用进行内存管理的呢?并不是这样的,我们还需要代码进行内存的管理.下面会结合着代码把OC中的ARC机制做一个详细的总结(欢迎大家批

iOS学习第四天杂记--Objective-C中的内存管理

先说明下,原文为青玉伏案写的.我这只是学习而已. OC中的内存管理. OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现):当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现):当计数器为0时,该对象占用的内存空间会被收回.在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值. Tips:测试时

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt

Cocos2d-x开发中C++内存管理

由于开始并没有介绍C++语言,C++的内存管理当然也没进行任何的说明,为了掌握Cocos2d-x中的内存管理机制,是有必要先了解一些C++内存管理的知识.C++内存管理非常复杂,如果完全地系统地介绍可能需要一本书的篇幅才能解释清楚.这里只给大家介绍C++内存管理最为基本的用法. 内存分配区域创建对象需要两个步骤:第一步,为对象分配内存,第二步,调用构造函数初始化内存.在第一步中对象分配内存时候,我们可以选择几个不同的分配区域,这几个区域如下:栈区域分配.栈内存分配运算内置于处理器的指令集中,效率

cocos2dx中的内存管理机制及引用计数

1.内存管理的两大策略: 谁申请,谁释放原则(类似于,谁污染了内存,最后由谁来清理内存)--------->适用于过程性函数 引用计数原则(创建时,引用数为1,每引用一次,计数加1,调用结束时,引用计数减1,当引用计数为0时,才会真正释放内存) --------->适用于注册性函数(消息处理,中断等场合) 2.cocos2dx中的内存管理采用引用计数和内存托管的原则 spr->retainCount();//获取对象的引用计数值 spr->retain();//引用计数加1 spr

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它