【问题标题】:In sydney does setting [weak] in front of an object make a penalty?在悉尼,在物体前设置 [弱] 会受到惩罚吗?
【发布时间】:2021-03-30 10:23:07
【问题描述】:

在 delphi sydney 中,在对象(不是接口)前面设置 [weak] 会造成惩罚吗? 例子:

  TMyObject = class(Tobject)
  Private
    [weak] FOwner: TMyObject;
    ....
  end;

我问是因为我知道内部 [weak] 引用存储在一个列表中,因此它有一些缺点(关于速度)。由于现在悉尼 ARC 已经消失,因此不再需要将 [weak] 放在对象前面(据我所知),但是因为我想让我的代码与 Rio 兼容,所以我问我是否可以安全地离开没有遭受无用性能损失的 [弱] 参考(在悉尼)

[weak] 属性有一个小问题。它表示一个 清零弱引用,当对象它时将被清零(niled) 指向不再有效。为了做到这一点,编译器必须 在运行时跟踪此类对象,这会带来一些开销。如果 您正在跟踪许多这样的参考资料,这些参考资料可以引入 显着的性能损失。

【问题讨论】:

  • 它什么都不做。
  • @StefanGlienke 有什么来源可以确认这种行为吗?我做了一些测试,是的,看起来是真的,但更愿意 100% 确定
  • 你不相信我是这件事的最终真相来源吗? Pff ;) 好吧,Rio 有这个页面:docwiki.embarcadero.com/RADStudio/Rio/en/… - 悉尼文档不再有它。 [Weak] 在未定义 WEAKINSTREF 时从未执行任何操作 - fwiw 页面 docwiki.embarcadero.com/RADStudio/Sydney/de/… 不正确 - 因为不应再在任何平台上定义 AUTOREFCOUNTWEAKINSTREF
  • @StefanGlienke 啊,是的,我相信你,但你是……嗯,你是人类 :)
  • 通常情况下,@StefanGlienke 的陈述比 docwiki 上的陈述更准确。

标签: delphi firemonkey


【解决方案1】:
object references

[weak] 属性仅在 ARC 编译器上实现。在经典的非 ARC 编译器上,[weak] 属性在用于对象引用时没有任何作用,也没有任何惩罚。

由于 10.4 Sydney 不再有 ARC 编译器,[weak] 属性不再需要,但它可用于保持向后兼容性。它不会影响使用非 ARC 编译器编译的代码。

[weak] 对非 ARC 编译器没有影响,可以通过 CPU 视图轻松检查。

var
  Obj: TObject;
  [weak] WObj: TObject;
begin
  Obj := TObject.Create;
  WObj := Obj;

  Obj.Free;
end;

在 Android ARC 编译器 10.3 上,将 Obj 分配给弱 WObj 将调用 _InstWeakCopy 过程来跟踪弱引用:

使用 10.4 Android 编译器编译时的相同代码不再调用 _InstWeakCopy

:


注意:此答案严格涵盖[weak] 属性在对象引用上使用时的行为。用于接口引用[weak] 的工作方式与以前相同,因为它是在柏林 10.1 的非 ARC 编译器中引入的。

【讨论】:

  • 当然[weak]对接口引用还是有影响的。 (我认为这个 A 的一些读者如果断章取义,可能看不到这一点。)
  • @AndreasRejbrand 这就是为什么我把 object references 用粗体放在顶部。
猜你喜欢
  • 2017-11-22
  • 2013-07-16
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多