gpt4 book ai didi

delphi - 默认的 TArray.Sort 比较器实际上是做什么的?什么时候会使用它?

转载 作者:行者123 更新时间:2023-12-03 14:50:26 25 4
gpt4 key购买 nike

在Delphi XE2的帮助中System.Generics.Collections.TArray.Sort ,它说

Note: If the Comparer parameter is provided, it is used to compare elements; otherwise the default comparator for the array elements is used. 

我仔细研究了一下,发现 TArray.Sort 的默认比较器是 _LookupVtableInfo来自System.Generics.Defaults 。其代码是

function _LookupVtableInfo(intf: TDefaultGenericInterface; info: PTypeInfo; size: Integer): Pointer;
var
pinfo: PVtableInfo;
begin
if info <> nil then
begin
pinfo := @VtableInfo[intf, info^.Kind];
Result := pinfo^.Data;
if ifSelector in pinfo^.Flags then
Result := TTypeInfoSelector(Result)(info, size);
if ifVariableSize in pinfo^.Flags then
Result := MakeInstance(Result, size);
end
else
begin
case intf of
giComparer: Result := Comparer_Selector_Binary(info, size);
giEqualityComparer: Result := EqualityComparer_Selector_Binary(info, size);
else
System.Error(reRangeError);
Result := nil;
end;
end;
end;

它被称为

IComparer<T>(_LookupVtableInfo(giComparer, TypeInfo(T), SizeOf(T)))

我已经对此进行了相当多的研究,但我不太确定我知道它的作用。它只是将内存中的位相互比较还是到底是什么?

问题的第二部分是一个更笼统的问题,即在什么情况下您可能真正想要使用默认比较器,或者您不太可能真正想要使用它?

最佳答案

默认比较器提供了许多常见类型的实现。具体来说,它支持以下内容:

  • 整数类型:Byte , Word , Integer等等
  • 枚举类型。
  • 浮点类型。
  • 字符串。
  • 套装。
  • 类实例。
  • 程序变量。
  • 方法。
  • 变体。
  • 静态数组。
  • 动态数组。
  • 接口(interface)。
  • 指针。
  • 记录。

对于其中许多类型,默认实现正是您所期望的。例如,对于整数、枚举类型、浮点类型,实现使用 < , >=运营商。对于 string默认实现调用 CompareStr .

对于其他类型,默认实现可能不太有用。例如,对于记录,比较是字节二进制比较。您很可能希望提供自己的比较器实现以记录。对于记录需要注意的一件事是,默认比较器将比较记录中的任何填充,而您永远不想这样做。因此,对于具有填充的对齐记录来说,它永远没有用处。我还对包含引用类型的记录的实用程序提出疑问。

对于动态数组,默认实现首先比较长度,然后,如果长度相等,则比较数组的二进制内容。因此,这对于简单值类型的数组可能是合理的。但对于多维动态数组或引用类型数组,则不然。

对于类实例、方法、过程变量、接口(interface),默认比较器将操作数视为指针(在方法的情况下是两个指针)并执行地址比较。

什么时候你想使用默认比较器?好吧,只要它符合您对比较器的要求,您就可以使用它。所以这对于简单的值类型来说当然是有意义的。除此之外,您需要根据具体情况做出决定。

关于delphi - 默认的 TArray.Sort 比较器实际上是做什么的?什么时候会使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com