德尔福的记录

Bil*_*orn 14 delphi records

关于德尔福记录的一些问题:

  1. 由于记录几乎像类,为什么不只使用类而不是记录?
  2. 理论上,当记录由变量声明时,将为记录分配内存; 但是,以后如何释放记忆?
  3. 我可以理解指向记录的指针到列表对象的实用程序,但是使用Generics Containers(TList<T>),是否需要使用指针呢?如果没有,如何删除/释放每个记录到通用容器?如果我想将特定记录删除到通用容器中,该怎么做?

Dis*_*ned 19

记录和类之间有很多差异; 没有"指针记录" <> "类".每个人都有自己的优点和缺点; 软件开发的一个重要事项是了解这些,以便您可以更轻松地选择最适合特定情况的软件.

  1. 这个问题是基于一个错误的前提.记录几乎不像类,就像整数不像双打一样.
    • 必须始终动态地实例化类,而这是可能的,但不是记录的要求.
    • 类的实例(我们称之为对象)总是通过引用传递,这意味着代码的多个部分将共享并作用于同一实例.这是要记住的重要事项,因为您可能无意中将对象修改为副作用; 虽然故意这样做是一个强大的功能.另一方面,记录按值传递; 你需要明确表明你是否通过引用传递它们.
    • 类不像"记录那样容易复制".当我说复制时,我指的是一个复制源的单独实例.(根据上面的价值/参考评论,这应该是显而易见的).
    • 记录往往与键入的文件非常好地工作(因为它们很容易复制).
    • 记录可以覆盖其他字段的字段(案例x /联合)
    • 这些是对记录的某些情境利益的评论; 相反,我也不会详细说明课程的情境利益.
  2. 也许最简单的理解方法是对它有点迂腐.让我们澄清一下; 内存未真正分配'当它声明'时,它在变量在范围内时分配,并在超出范围时释放.因此对于局部变量,它在例程开始之前分配,并在结束之后解除分配.对于类字段,它在创建对象时分配,在销毁时解除分配.
  3. 再次,有利有弊......
    • 它可能更慢并且需要更多内存来复制整个记录(与泛型一样)而不是仅仅复制引用.
    • 通过引用传递记录(使用指针)是一种强大的技术,您可以轻松地使用其他内容修改您的记录副本.如果没有这个,你必须按值传递你的记录(即复制它),结果收到改变的记录,再将它复制到你自己的结构中.
  4. 指向类似记录的指针?一点都不.只有两个不同之处:
    • 类支持多态继承.
    • 类可以实现接口.


Mas*_*ler 10

对于1和2:记录是值类型,而类是引用类型.它们被分配在堆栈上,或直接分配在包含它们的任何较大变量的内存空间中,而不是通过指针,并在编译器超出范围时自动清理.

至于你的第三个问题,TList<TMyRecord>内部声明了一个array of TMyRecord存储空间.销毁列表时,将清除其中的所有记录.如果要删除特定的一个,请使用Delete方法按索引删除,或使用Remove查找和删除方法.但要注意,因为它是一个值类型,所以你所做的一切都是制作记录的副本,而不是复制对它的引用.

  • 不,指向记录的指针 = 指向记录的指针。对象(类实例)在几个方面与记录不同。 (2认同)

Lar*_*s D 9

记录的一个主要好处是,当你有一个大的"记录阵列".这是通过为一个连续的RAM空间中的所有记录分配空间而在内存中创建的,这非常快.如果你使用了"TClass数组",那么数组中的每个对象都必须自己分配,这很慢.

为了提高字符串和对象的速度,已经做了很多工作来提高分配内存的速度,但它永远不会像用1个内存分配替换100,000个内存分配一样快.

但是,如果使用记录数组,请不要在局部变量中复制记录.这可能很容易扼杀速度效益.