gpt4 book ai didi

delphi - 哪种情况下堆分配更轻/更重?

转载 作者:行者123 更新时间:2023-12-03 19:07:09 24 4
gpt4 key购买 nike

作为 a previous answer to another question 的后续行动,我开始好奇堆分配是如何在循环中工作的。

以下面两种场景为例:

声明:

SomeList: TObjectList<TSomething>;

场景 1:

begin
for X := 1 to 10 do
SomeList[X].DoSomething;
end;

场景 2:

var
S: TSomething;
begin
for X:= 1 to 10 do begin
S:= SomeList[X];
S.DoSomething;
end;
end;

现在我很好奇堆分配在这两种情况下是如何工作的。场景1是在每次循环迭代中直接调用列表项,我想知道它是否会在每次循环迭代时添加到堆中并释放。另一方面,第二种情况显然有一个堆分配,只需声明一个局部变量即可。

我想知道哪种情况对堆分配执行更重的负载(作为导致性能问题的一个主要原因)?

最佳答案

Now what I'm curious about is how heap allocations work in either scenario.

您的示例中没有堆分配(除非 DoSomething() 在内部分配内存)。

Scenario 1 is directly calling the list item in each loop iteration

情况 2 也是如此。

I'm wondering if it adds to the heap and releases for each time the loop iterates.

没有任何东西被添加到堆中。

The second scenario on the other hand, obviously has one heap allocation, by simply declaring a local variable.

局部变量分配在,而不是。不过,变量可以指向堆上的内存。场景 2 中的 S 变量会起作用,因为 TObject 派生类始终分配在堆上。 S 只是堆栈上的一个局部变量,指向 TSomething 对象占用的堆内存。

What I'm wondering is which scenario performs the heavier load on heap allocation (as being one leading cause to performance issues)?

都不是,因为您的示例中没有堆分配。

关于delphi - 哪种情况下堆分配更轻/更重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32107543/

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