gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:43:50 24 4
gpt4 key购买 nike

我有一个可以正常工作的 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/

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