如果我用我的Delphi程序中的所有对象引用替换接口引用,并使用从TInterfacedObject继承的对象,生成的应用程序将以与以前相同的速度运行吗?或者引用计数是否在运行时添加了重要的执行开销?
答案 0 :(得分:8)
如果对这些接口进行大量赋值(或在函数调用中将它们作为非const,非var参数传递),引用计数会对您产生影响。
然而真正的麻烦通常不是引用计数本身,而是隐式try-finally构造编译器添加以保护引用计数,这将累积到您的调用开销,并且如果您有许多可能是最痛苦的简单的方法(相对于一个包含所有代码的单个大程序,你真的不需要)。
为了缓解这个方面,总是将接口作为const或var参数传递,避免将接口作为函数调用结果返回,并最小化接口类型的局部变量的使用,更喜欢const参数和直接对象字段用法。
答案 1 :(得分:6)
接口类确实带有增加和释放你创建,传递和销毁的每个实例的引用计数的开销,但除非你在紧密循环中创建,销毁和传递引用,否则你不应该遇到任何明显的减速。
您当然可以通过在_AddRef和_Release覆盖中返回-1来禁用引用计数,但这并不妨碍编译器生成这些调用...
答案 2 :(得分:2)
不仅引用计数 - 仅通过接口引用调用对象的方法总是意味着开销。 Here您可以阅读如何通过Delphi中的接口引用调用对象的方法。