关于德尔福记录的一些问题:
TList<T>
),是否需要使用指针呢?如果没有,如何删除/释放每个记录到通用容器?如果我想将特定记录删除到通用容器中,该怎么做?答案 0 :(得分:19)
记录和类之间存在很多差异;没有“指针记录”&lt;&gt; “类”。每个人都有自己的优点和缺点;软件开发的一个重要事项是了解这些,以便您可以更轻松地选择最适合特定情况的。
答案 1 :(得分:10)
对于1和2:记录是值类型,而类是引用类型。它们被分配在堆栈上,或直接分配在包含它们的任何较大变量的内存空间中,而不是通过指针,并在编译器超出范围时自动清理。
关于您的第三个问题,TList<TMyRecord>
在内部声明array of TMyRecord
存储空间。销毁列表时,将清除其中的所有记录。如果要删除特定的一个,请使用Delete
方法按索引删除,或使用Remove
方法查找和删除。但要注意,因为它是一个值类型,所以你所做的一切都是复制记录,而不是复制对它的引用。
答案 2 :(得分:9)
记录的一个主要好处是,当你有一个大的“记录数组”时。这是通过为一个连续的RAM空间中的所有记录分配空间而在内存中创建的,这非常快。如果您使用了“TClass数组”,那么数组中的每个对象都必须自己分配,这很慢。
为了提高字符串和对象的速度,已经做了很多工作来提高分配内存的速度,但它永远不会像用1个内存分配替换100,000个内存分配一样快。
但是,如果使用记录数组,请不要在局部变量中复制记录。这可能很容易扼杀速度效益。
答案 3 :(得分:3)
类和记录之间还有一些其他差异。类可以使用polymorphism,并公开接口。记录无法实现析构函数(尽管自Delphi 2006起,它们现在可以实现构造函数和方法)。
记录在将内存分段为更逻辑的结构时非常有用,因为记录中的第一个数据项位于指向记录本身的指针的同一地址点。类不是这种情况。
答案 4 :(得分:3)
1)为了允许继承和多态,类有一些开销。记录不允许它们,并且在某些情况下可能更快更简单地使用。与总是在堆中分配并通过引用管理的类不同,记录也可以在堆栈上分配,直接访问和相互分配,而无需调用“分配”方法。 此外,记录对于访问具有给定结构的内存块非常有用,因为它们的内存布局正是您定义它的方式。类实例内存布局由编译器控制,并具有使对象起作用的附加数据(即指向虚方法表的指针)。
2)除非你使用New()或GetMem()动态分配记录,否则记录的内存由编译器管理为序数,浮点数或静态数组:全局变量内存在启动时分配,在程序终止时释放,并且在堆栈上分配局部变量,输入函数/过程/方法并释放退出。在堆栈中分配/释放内存更快,因为它不需要调用内存管理器,只需要很少的汇编指令来更改堆栈寄存器。但请注意,在堆栈上分配大型结构可能会导致堆栈溢出,因为最大堆栈大小是固定的并且不是很大(请参阅链接器选项)。 如果记录是类的字段,则在创建类时分配它们,并在释放类时释放它们。
3)泛型的一个优点是消除了低级指针管理的需要 - 但要注意内部工作。