将本地动态数组的长度设置为零会减少内存使用吗?

法布里佐

将本地动态数组的长度设置为零(不再需要时)是否具有使用内存的好处?

例如:

var
  MyArray : array of string;
begin
  <filling my array with a lot of items....>

  <doing some stuffs with MyArray>

  //from here on, MyArray is no more needed, should I set its length to zero?
  SetLength(MyArray, 0);

  <doing other stuffs which doesn't need MyArray...>
end;
安德烈亚斯·瑞布兰德(Andreas Rejbrand)

在Delphi中,动态数组是按引用计数的。

因此,如果您这样做

MyArray := nil;

要么

Finalize(MyArray);

要么

SetLength(MyArray, 0);

该变量MyArray将不再指向动态数组堆对象,因此其引用计数将减少1。如果这会使引用计数降至零,这意味着没有变量指向它,则它将被释放。

例子1

所以在

var
  a: array of Integer;
begin

  SetLength(a, 1024*1024);

  // ...

  SetLength(a, 0);

  // ...

end

您将释放内存SetLength(a, 0)假设这a是指向此堆对象的唯一变量

例子2

var
  b: TArray<Integer>;

procedure Test;
var
  a: TArray<Integer>;
begin

  SetLength(a, 1024*1024);

  b := a;

  SetLength(a, 0);

  // ...

end

SetLength(a, 0)不会释放任何内存,因为b仍参照原来的数组。它将引用计数从2减少到1。

例子3

当然,在

var
  a: array of Integer;
begin

  SetLength(a, 1024*1024);

  // ...

  SetLength(a, 0);

end

最后一个调用SetLength完全没有必要,因为a无论如何局部变量都将超出下一行代码的作用域,这也减少了堆对象的引用计数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将本地动态数组的长度设置为零会减少内存使用吗?

来自分类Dev

使用后,数组的长度应设置为零吗?

来自分类Dev

这种优化会减少内存使用吗?

来自分类Dev

使用分配会减少使用的内存量吗?

来自分类Dev

使用分配会减少使用的内存量吗?

来自分类Dev

将数组的元素设置为零

来自分类Dev

使用IntStream会导致某些数组元素被错误地设置为零(JVM Bug,Java 11)

来自分类Dev

增加动态分派的使用会减少编译时间吗?

来自分类Dev

如何最轻松地使用AlmofireImage将NSURLCache的内存容量设置为零?

来自分类Dev

Delphi动态数组分配给临时本地动态数组变量

来自分类Dev

使用numpy将范围设置为零

来自分类Dev

在函数调用中堆和删除。如何删除本地动态内存?

来自分类Dev

使用本地数据将冻结设置为jqGrid的前两列。colModel和colNames是动态绑定的

来自分类Dev

可以将单例设置为零吗?

来自分类Dev

将numpy数组中的列设置为零

来自分类Dev

将指定索引列表上的数组设置为零

来自分类Dev

如何将空数组元素设置为零?

来自分类Dev

将数组长度设置为变量值?

来自分类Dev

在OpenCL中使用本地内存并行减少

来自分类Dev

数组上有元素,但长度为零

来自分类Dev

可以将GitHub / BitBucket设置为本地存储库吗?

来自分类Dev

将内存设置图像减少到imageview

来自分类Dev

是否将numpy数组设置为“无可用内存”?

来自分类Dev

将setActiveSelection设置为零

来自分类Dev

当我将暗淡的长度设置为零时,为什么不会引起错误?

来自分类Dev

我可以将动态资源的属性设置为动态资源,当我更改属性资源时,父资源也会更改吗?

来自分类Dev

使用本地数据将冻结设置为jqGrid的前两列。动态绑定colModel和colNames的位置

来自分类Dev

无法使用 CarrierWave 将文件字段设置为零

来自分类Dev

在不使用for循环的情况下将单元格数组中特定的矩阵行设置为零

Related 相关文章

  1. 1

    将本地动态数组的长度设置为零会减少内存使用吗?

  2. 2

    使用后,数组的长度应设置为零吗?

  3. 3

    这种优化会减少内存使用吗?

  4. 4

    使用分配会减少使用的内存量吗?

  5. 5

    使用分配会减少使用的内存量吗?

  6. 6

    将数组的元素设置为零

  7. 7

    使用IntStream会导致某些数组元素被错误地设置为零(JVM Bug,Java 11)

  8. 8

    增加动态分派的使用会减少编译时间吗?

  9. 9

    如何最轻松地使用AlmofireImage将NSURLCache的内存容量设置为零?

  10. 10

    Delphi动态数组分配给临时本地动态数组变量

  11. 11

    使用numpy将范围设置为零

  12. 12

    在函数调用中堆和删除。如何删除本地动态内存?

  13. 13

    使用本地数据将冻结设置为jqGrid的前两列。colModel和colNames是动态绑定的

  14. 14

    可以将单例设置为零吗?

  15. 15

    将numpy数组中的列设置为零

  16. 16

    将指定索引列表上的数组设置为零

  17. 17

    如何将空数组元素设置为零?

  18. 18

    将数组长度设置为变量值?

  19. 19

    在OpenCL中使用本地内存并行减少

  20. 20

    数组上有元素,但长度为零

  21. 21

    可以将GitHub / BitBucket设置为本地存储库吗?

  22. 22

    将内存设置图像减少到imageview

  23. 23

    是否将numpy数组设置为“无可用内存”?

  24. 24

    将setActiveSelection设置为零

  25. 25

    当我将暗淡的长度设置为零时,为什么不会引起错误?

  26. 26

    我可以将动态资源的属性设置为动态资源,当我更改属性资源时,父资源也会更改吗?

  27. 27

    使用本地数据将冻结设置为jqGrid的前两列。动态绑定colModel和colNames的位置

  28. 28

    无法使用 CarrierWave 将文件字段设置为零

  29. 29

    在不使用for循环的情况下将单元格数组中特定的矩阵行设置为零

热门标签

归档