Delphi10.4发布在即,看了许多特性宣传,最值得期待的就是托管记录。
最开始Delphi的结构体支持操作符重载,就很兴奋,想自己封装算法库,自己封装智能指针。
比如自己实现string,自己实现BigInt之类的。结果发现record虽然支持了操作符重载,但是不能自动初始化和反初始化。导致一些事情很难做,比如string我要默认是”,BigInt默认是0等等。
十几年前就建议增加初始化和反初始化的操作符重载,结果人家回了句话十几年都在没动静。
好在这次总算是增加了这方面的支持,但是我觉得还没做全。
想要实现类似C++的智能指针还缺个重要的操作符重载,就是.或者->(Delphi里面是^.).
例如:
CComPtr
…
test->Invoke(….)
CComPtr就是个智能指针,对CComPtr的访问,会转变成对真正IDispatch的访问,CComPtr的构造和析构会访问_AddRef和_Release,->操作符的访问会变成对IDispatch对方的->操作符的访问。
如果Delphi的record能再增加对.或者^.的重载就更加完善了。
如果能做到这一步,我觉得Delphi编译器对Interface的自动产生调用_addRef,_release的代码都可以去掉了,用智能指针做就OK了。
目前10.4的托管记录只能算个玩具,写一个看看生成的汇编代码就知道了,有多少个托管记录,就插入多少个 try..finally..end 代码块,应该是当前 begin..end 中无论有多少个托管记录,应该统一用一个 try 代码块处理,而且内联变量涉及到托管类型时也是一个吊样,声明多少个内联托管类型变量,就给你插入多少个 try 代码块,极其垃圾,好在10.4总算解决了内联方法中带有托管类型返回值的问题,搞得我在 10.3 中涉及到返回托管类型的内联方法全把 inline 给注释掉了,那时生成的代码才叫惨不忍睹
还有一些 10.4 编译器的问题,比如:
function test: string;
begin
result := ‘hello’;
end;
begin
test;
test;
test;
end;
你对比下 10.3 和 10.4 生成的汇编码,极其垃圾,无尽的给你插入 try 代码块,合成这是把所有方法返回托管类型都当成内联变量的方式去生成汇编码了,此 bug 已提交给官方,具体啥时候能优化这些问题,那就知道了。
另外有个问题想问下博主,你这发表评论下面的那个验证功能实在挺好玩的,不知是用的什么插件?求赐教
很久没研究这么详细了,你研究的还是非常细致的啊。
那个评论插件叫Fancy Captcha
因为我想通过托管记录实现智能指针之类的东西,自动对对象或指针进行释放管理,所以一直很期待托管记录这个功能,本来10.3就应该支持的,后来又被推到10.4,满怀喜悦的终于等到了,一看汇编码,性能极其低劣,还不如手写 try,10.3 虽然可以用 reference to function 来实现类似的功能,但是毕竟还得在堆中创建一个 TInterfacedObject 对象来搞,多少会损失一些性能和效率,极其不满意,而 delphi 又不支持在栈中创建对象,所以唯一感到有希望的托管记录竟然生成的机器码如此垃圾,简直失望至极
看我的新文章,托管记录X86基本是Try Finally的语法糖,在X64上产生的代码还是可以的。
reference to function我觉得用易博龙托管记录实现可能更好一些,可是这玩意出现在托管记录之前,所以他们是用TInterfacedObject 来实现的,不知道以后会不会改。VC是用struct来实现的。
落落地问下,新版的自动完成在哪里设置呢,找了一圈没找到
CTRL+空格(WIN10没问题,其他系统呵呵了)
自带的代码自动完成设置:
Tools -> Options ,右上角输入code com,回车基本可以跳转过去了
等待下一版吧,或者用CnPack吧(我以前Delphi 7用的,不知道现在好用不)
10.4终于和ARC分手了,期待下一集
123
deldel2