在没有引用计数的情况下交换字符串

Swap strings without reference counting

在 QuickSort 中,大量时间花在了交换 temp:=var[i]; var[i]:=var[j]; var[j]:=temp 上。当 vars 是整数时,我为大型随机数组计时 140 毫秒。当变量为字符串时,时间为 750 毫秒。在我看来,大部分差异是由于需要更新所有三个作业中的引用计数造成的。 但这有必要吗?毕竟,var[i] 和 var[j] 的引用计数在这三个赋值前后是相同的。以下代码会损坏东西吗? (不是说它解决了速度问题,而是出于兴趣):

    // P : Pstring;
    move(values[i],P,sizeOf(Pstring));
    move(values[j],values[i],sizeOf(Pstring));
    move(P,values[i],sizeOf(Pstring));

没有临时变量。只有指向字符串的两个指针会互换。如果可以,是否有 Delphi 函数来交换 2 个指针?

您提出的是众所周知且有效的优化。与其调用 Move 函数,不如使用强制转换执行直接赋值,以避免生成引用计数代码。

var
  temp: Pointer;
.... 
temp := Pointer(var[i]);
Pointer(var[i]) := Pointer(var[j]);
Pointer(var[j]) := temp;

为了使其正常工作,您需要确信在交换过程中不会出现异常。有效内存的简单分配不会导致异常,因此可以轻松消除这种担忧。