arrays - 当持有数组的引用计数增加时,如何增加子数组的引用计数?

标签 arrays delphi delphi-xe2 reference-counting copy-on-write

我有一个可以正常工作的 COWarray,但现在我想扩展维数,如下所示:

type
  TCOWArray2<T> = record
  private
    type
      TItem = record
        fItems: TArray<T>;
        fStart, fFinish: NativeInt;
      end;
  private
    fItems: array of TItem;
  private
     methods
  public
     ....
  end;

数组将其项目分成 block 。每个子数组都有例如100 个项目,平均数组有任意数量的项目。
对外仅呈现一个一维数组,但在内部子数组中存储T类型的数据。

这样,当单个项目发生更改时,我就可以拥有写入的副本,而只需进行很少的复制。 不是克隆所有 20,000 个项目,而是仅克隆 100 个项目加上包含 200 个项目的平均数组,即仅 300 个项目,减少了近 99% 的工作量和存储空间。

问题是我需要跟踪主数组引用计数的变化并将其传播到子数组。

类似于:

procedure TCOWArray<T>.SomeMember.AddRef;
var
  Item: TItem;
begin
  inherited;
  for Item in fItems do Item.IncreaseRefCount;
end;

显然出于性能原因,我将使用普通的 for i 循环

我该如何做到这一点?
我正在考虑添加自定义 TInterfaced 对象,但我不确定如何使其工作。

最佳答案

这似乎是多维系列问题中的第二个。

该系列的第一个问题,外部尺寸,在这里:Why does the compiler insist my function is inline when it's not?虽然问题标题涉及错误消息,但它最终变成了关于写时复制数组的实现的问题。这是问题的一维版本。

现在我们继续讨论这个问题。这是二维版本。我们按照第一个问题的方法来解决。因为这实际上是完全相同的问题。一旦我们能够解决一维数组的问题,同样的解决方案也适用于 N 维数组。

当您需要修改数组的元素时,请在内部数组上调用SetLength。这为您提供了一个独特的外部数组。此处发生的任何复制都仅复制对内部子数组的引用。

然后确定需要操作的内部子数组。完成此操作后,再次调用 SetLength 以使该内部子数组唯一。然后修改该值。

添加多少个维度并不重要。答案总是一样的。我希望这个问题可以结束这个系列! ;-)

关于arrays - 当持有数组的引用计数增加时,如何增加子数组的引用计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24335689/

相关文章:

javascript - 理解 javascript 中的 for 循环

c++ - C++ 中的 3 维数组

delphi - Delphi Indy发送电子邮件

delphi - 我可以在MySQL查询/存储过程中为IN子句使用参数吗

delphi - 如何使用 GridPanel 创建类似 RowSpan、ColSpan Delphi 的组件属性

delphi - XE2 的 VirtualTreeView 组件

java - 在不克隆数组的情况下在二维数组的列中搜索数字的最佳性能

java - 将字节数组写入文件。并不总能得到预期的结果

字符串格式化过程与writeln类似

Delphi 2010 Action 管理器和主菜单栏