- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Delphi 有点陌生,这个问题只是我好奇。 (我也只是偶然尝试使用它,结果发现我不应该这样做。)
如果您查看 TObject.InitInstance
的文档它告诉您不要使用它,除非您要覆盖 NewInstance
。该方法也是公开的。如果用户不应该调用它,为什么不对其进行保护呢?
最佳答案
自从 1992 年中期整个 Delphi 事件开始时我就在场,这个问题可能有几个答案。如果您查看 Delphi 1 中 TObject 的原始声明,就会发现 TObject 上没有任何 protected /私有(private)成员。这是因为在 Delphi 开发的早期阶段,随着语言中异常的引入,异常是从与其他对象不同的堆中分配的。这就是 NewInstance/InitInstance/CleanupInstance/FreeInstance 函数的起源。在类类型上重写这些函数,您可以从字面上控制对象的分配位置。
近年来,我使用此功能创建了字面上“回收”的对象实例的缓存。通过拦截 NewInstance 和 FreeInstance,我创建了一个系统,其中实例在解除分配时不会返回到堆,而是被放置在无锁/低锁链表上。这使得分配/释放特定类型的实例变得更快,并消除了对内存管理器的大量访问。
通过将 InitInstance 设为公共(public)(其相反是 CleanupInstance),这将允许从其他实用程序函数调用这些方法。在上面我提到的情况下,可以在现有内存块上调用 InitInstance,而不必仅从 NewInstance 调用。假设 NewInstance 调用管理上述缓存的通用函数。类实例的“范围”丢失了,因此调用 InitInstance 的唯一方法就是将其公开。
有一天,我们可能会发布执行我上面描述的操作的代码......目前它是内部“研究”项目的一部分。
哦,顺便说一句,也是一个历史教训......在 Delphi 1 版本之前,如何分配/释放 Exception 实例的设计又回到了使用与所有其他对象相同的堆。由于整体集体失误,假设我们需要分配所有异常对象实例来“保护”内存不足的情况。我们推断,如果我们尝试引发异常,因为内存管理器“内存不足”,那么我们将如何分配异常实例!?我们已经知道那时没有内存!因此,我们决定对所有异常都需要一个单独的堆...直到 Chuck Jazdzewski 或 Anders Heijlsberg(我具体忘记是哪一个)找到了一个简单且相当聪明的解决方案...只需预分配 启动时出现内存不足异常!我们仍然需要控制异常是否应该真正被释放(异常实例在处理后会自动释放),因此整个 NewInstance/FreeInstance 机制仍然存在。
关于Delphi - 为什么 TObject.InitInstance 是公共(public)的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22540670/
我刚读 "Any class that implements the IEqualityComparer interface is expected to provide the implementa
我一次又一次地看到使用 Func 的 API(尤其是在 .NET 框架中)什么时候Predicate似乎是一个完全负责任的选择。 API 设计者这样做的好理由是什么? 最佳答案 在 LINQ 中,Fu
我目前正在考虑一个场景,我想要一个通用类,它在其项目上调用 Free IF 这些都是对象类型。所以我尝试了以下方法: if (PTypeInfo (TypeInfo (T)).Kind = tkCla
我有一个过程需要 TObject 类型的参数,如下所示: MyProcedure (const AValue : TObject); 我有一个 Variant 数组,我正在循环调用该过程,如下所示:
(发件人:TObject)是什么意思?如: procedure TForm1.Button1Click(Sender:TObject); var s: Integer; begin ..... ...
TObject.InstanceSize 返回 8,但 TObject 未声明任何数据成员。根据TObject.ClassType的实现,前4个字节可以解释为指向对象的TClass元数据的指针。有人知
我们正试图弄清楚我们的软件中是否存在内存泄漏。所以,我一直在使用各种工具和程序来帮助我找到可能的内存泄漏。我使用的软件之一是 AQTime。由于它与 Delphi XE 一起提供,它只是一个演示。所以
如何将当前状态的对象保存到文件中?这样就可以立即读取并恢复它的所有变量。 最佳答案 您正在寻找的称为对象持久性。这个article可能会有所帮助,如果你用谷歌搜索“delphi持久对象”,还有很多其他
我正在 Delphi XE2 中编写一个支持触摸屏的应用程序。 我有一个带有 TEdits 的表单。当我单击它们时,我调用我编写的过程来显示另一个最大化的始终位于顶部的窗体,其中带有带有标签(用于标题
我似乎无法通过搜索找到答案,所以这里...... 我知道我可以通过使用这种类型的代码将 Class 对象一般地传递给其他类: public class ClsGeneric where TObje
请了解此代码: type TClient = class(TObject) public Host: String; Queue: TIdThreadSafeStringLis
想使用 Sender 作为 TObject 作为我的案例的选择标准...声明 procedure TForm.ShowGUI (Sender: TObject); begin case sende
基于之前的一个答案 post ,我正在研究以下设计的可能性 TChildClass = class(TObject) private FField1: string; FField2: s
我试图使用下面的代码将 TObject.AfterConstruction 重定向到另一个过程,但一段时间后开始出现很多异常。注意:我使用这种重定向到许多其他解决方案。 unit Unit109; i
这里是一些示例代码,它是 Delphi 中的一个独立控制台应用程序,它创建一个对象,然后创建一个 TInterfacedObject 对象,并将 Interface 引用分配给 TObject 中的字
我怎样才能让我的代码工作? :) 我试图提出这个问题,但经过几次失败的尝试后,我认为你们通过查看代码会比阅读我的“解释”更快地发现问题。谢谢。 setCtrlState([ memo1, edit1,
我有一个需要返回一个对象的方法。当然,只有当 T 是一个对象时才有意义: function TGrobber.Swipe: TObject; var current: T; begin
看看这个类: TTest = class(TObject) public constructor Create(A:Integer);overload; constructor Crea
除此之外post其接受的答案仍然非常神秘: @Button1.OnClick := pPointer(Cardinal(pPointer( procedure (sender: tObject) be
目前Delphi XE只能在我的盒子上使用,我不知道Delphi 2010/XE2是否引入了一些突破性的变化。 请帮我更新以下定义: TVmt = packed record SelfPtr
我是一名优秀的程序员,十分优秀!