- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在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
等等对于其中许多类型,默认实现正是您所期望的。例如,对于整数、枚举类型、浮点类型,实现使用 <
, >
和=
运营商。对于 string
默认实现调用 CompareStr
.
对于其他类型,默认实现可能不太有用。例如,对于记录,比较是字节二进制比较。您很可能希望提供自己的比较器实现以记录。对于记录需要注意的一件事是,默认比较器将比较记录中的任何填充,而您永远不想这样做。因此,对于具有填充的对齐记录来说,它永远没有用处。我还对包含引用类型的记录的实用程序提出疑问。
对于动态数组,默认实现首先比较长度,然后,如果长度相等,则比较数组的二进制内容。因此,这对于简单值类型的数组可能是合理的。但对于多维动态数组或引用类型数组,则不然。
对于类实例、方法、过程变量、接口(interface),默认比较器将操作数视为指针(在方法的情况下是两个指针)并执行地址比较。
什么时候你想使用默认比较器?好吧,只要它符合您对比较器的要求,您就可以使用它。所以这对于简单的值类型来说当然是有意义的。除此之外,您需要根据具体情况做出决定。
关于delphi - 默认的 TArray.Sort 比较器实际上是做什么的?什么时候会使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17951412/
在 C++ 中我可以做到 class A { public: A(std::vector> v) : _v(std::move(v)) {} private: std::vector>
我想知道以下代码是否会可靠地返回 nullptr 而不会出现任何复杂情况: TArray SomeActors; ASomeActor* SomeActor = SomeActors[0]; retu
我正在寻找一种更好的方法来初始化我的 lst_devices : TArray变量。 今天,我是这样做的(这非常丑陋,而且有代码味道,但至少可以正常工作)。 lst_devices_id := [''
uses Generics.Collections, types, rtti, System.Generics.Collections; procedure GimmePairArray(cons
这是什么原因TArray.Sort当我比较中有大量数字时不起作用? 我的代码如下(Delphiy Tokyo): Interface Type RCInd = record N
我刚刚开始接触这个。 PNode = ^TNode; TNode = record Obstacle : boolean; Visited : boolean; GCost : doubl
当我发现这样的构造实际上可以编译并产生所需的结果时,这只是偶然的: var Arr: TArray; begin Arr := TArray.Create(100, 101, 102); en
我有这个代码 var arr: TArray; e1, e2, e3, e4: string; begin e1 := 'val1'; e2 := 'val2'; e3 := 'val3'; e4 :
如何分配 TArray至array of Byte反之亦然? TEncoding.UTF8.GetBytes返回 TArray 。 TIdHashMessageDigest5.HashBytes有一个
我的代码的很大一部分( delphi-dutil 等)使用 TStringDynArray 。现在我想将所有键转换为 TDictionary到 TStringDynArray 。不幸的是我只找到了TD
在Delphi XE2的帮助中System.Generics.Collections.TArray.Sort ,它说 Note: If the Comparer parameter is provid
我知道 array of const被“翻译”为array of TVarRec由编译器所以我想知道是否有一种方法可以直接存储开放数组的副本(或者可能使用 const 的引用),我的意思是无需创建循环
虚幻引擎(C++) 您好,我有一个来自 TCP 连接的 TArray of Bytes。我有 58 字节的 header 和 12 x 4 字节的 Float32。我需要从我的 Array Bytes
这 3 种类型非常相似... TArray 是 TBytes 的通用版本。两者都可以转换为 PByteArray 并用作调用 Windows API 的缓冲区。 (与字符串到 Pchar 具有相同的限
我的记录类型定义如下: type TRecordType = record Field1: string; Field2: Variant; end;
我有很多变量声明为 var Something: array of XXX; begin SetLength(Something, 10); try ... finally
今天我发现了一个编译器错误 ( QC#108577 )。 以下程序无法编译: program Project1; {$APPTYPE CONSOLE} procedure P(M: TArray>);
我已将 outputBuffer 声明为 Byte 并相应地使用它: TFile.WriteAllBytes(outputPath, outputBuffer); 当我编译程序时,Delphi 输出:
我正在向在线 API 发出 GET 请求,但无法获取嵌套的 Json 值以设置为 C++(虚幻引擎 4)中的数组。我得到了除嵌套数组 LE (key) 之外的所有值 这里是 JSON {
我正在将旧版 Delphi 应用程序迁移到 Delphi-XE2,我想知道是否有充分的理由替换定义为 Array of MyType 的数组。至TArray 。那么问题来了 TArray 的优缺点是什
我是一名优秀的程序员,十分优秀!