CompareMem是否适合比较两个数组是否相等?

EPr*_*und 5 arrays delphi compare

我需要比较给定数组的所有项目是否相同。

现在,我有以下代码:

Type
  TD = array [0..1] of TDateTime;

var A: TD;
    B: TD;
begin
  A[0] := Date-1;   A[1] := Date+1;
  B[0] := Date-1;   B[1] := Date+1;

  if CompareMem(@A, @B, SizeOf(TD)) then
    Showmessage('Equals')
  else
    Showmessage('Differ');
Run Code Online (Sandbox Code Playgroud)

这工作正常,但是由于CompareMem是用汇编编写的,因此我(目前)还无法理解它的作用。

CompareMem是执行我想要的事情的有效方法吗?另外,我想知道是否适用于所有数据类型,例如字符串,整数等。

Ari*_*The 5

这不是用汇编语言编写的。如果所有内存中都填充有没有间隙的数组项,则比较内存有效。通常,如果

1)所有阵列内存中都填充有没有间隙的数据(间隙可能包含垃圾并导致假负数)。

1.1。packed array如果编译器不会忽略它,则应通过关键字强制执行

1.2如果SizeOf(A [1])为2,4,8,16等,则应该发生这种情况

但是您最好通过使用具有不同模式的FillChar进行单元测试来覆盖这一点-它们将模仿垃圾,然后用匹配值手动填充数组元素,然后使用CompareMem检查元素是否擦除了所有预先填充的垃圾。

2)数组元素仅包含简单的值类型,而不包含引用类型。

Char,整数,双精度型,短字符串,固定大小的数组或由它们组成的记录-是简单类型。

所有其他字符串,指针,对象,接口,动态数组和开放数组-仅仅是指向外部数据的指针,无法“通过内存”进行比较

您可以阅读有关http://docwiki.embarcadero.com/Libraries/XE2/en/System.Finalize的更多提示。程序/函数的汇编程序实现也将是一个不错的话题,因为它将涵盖不同Delphi数据类型的二进制表示形式

  • 你对填充的讨论是有缺陷的。Delphi 数组总是打包的。但记录可能不是。如果不是,则比较内存不起作用,因为您比较的是没有意义的填充字节。 (2认同)

Dav*_*nan 5

CompareMem只需执行一个字节一个字节的比较。CompareMem无法通过两种主要方法对值进行相等性测试无效:

  1. 被测试的类型包含填充。
  2. 被测试的类型是或包含引用类型。

您正在询问数组。由于数组是总是压缩的,因此不包含填充。由于您正在比较数组值,因此问题可以集中在数组的元素上。

当且仅当数组元素是不包含填充字节且不包含引用类型的值类型时,才需要对数组进行值比较。

所有简单值类型都是这种情况。

对于记录,您需要检查记录是否包含引用类型。这必须是递归检查。记录是否包含包含引用类型的记录,依此类推。然后,您必须寻找填充。一旦找到填充,CompareMem就不适合使用。