tconst接口指针列表



我有class field

someList : TList<SomeInterFace>;

我只需要在列表中存储对象并搜索它们,永远不想修改。所以我决定写

someList : TList<const SomeInterFace>;

但是我有很多编译错误。似乎不可能在标准Delphi容器中存储const对象?

const仅在方法上下文中有意义:

procedure DoSomethingWithInterface(const AInterface: SomeInterface)
begin
// do something
end;

在这里,没有const声明,接口的引用计数在传递给方法时递增,在方法返回时再次递减。使用const时,接口通过引用传递,但不修改引用计数。这是有效的,因为当您还在方法内部时,接口的引用计数不可能下降,因此程序可以将方法内部的这种临时使用视为没有发生,从而节省了必须修改引用计数字段的开销。这里有更多的阅读

然而,在列表中存储引用则完全是另一回事,因为列表中对象的生命周期是不确定的。方法具有明确的开始和结束,因此对对象的引用的持续时间受到严格限制—在仍然使用对象时,不存在对象被删除的风险(尽管对共享变量进行跨线程操作或其他此类并发性错误)。但是,在列表中,不能保证引用在列表中存在多长时间,因此您不能绕过增加引用计数。

此外,在方法中使用const的巨大节省是编译器在方法周围生成隐式try/finally块,否则将管理引用计数。在方法中使用const可以节省try/finally的开销,这是主要的性能增益。但是,当向列表添加字符串或接口引用时,不会生成这样的隐式代码,因为开发人员完全控制列表中引用的生命周期,而不像传递给方法的参数,编译器必须管理。

所以,总的来说,没有办法做你所建议的,但是也没有需要去做你所建议的。如果你在列表中绕过接口引用的引用计数,那么它们所指向的对象可能会在任何时候被删除,而对它们的其他引用也会消失,你最终会在列表中得到一个死引用。

相关内容

  • 没有找到相关文章

最新更新