将本地动态数组的长度设置为零会减少内存使用量吗?
Does setting a local dynamic array's length to zero reduce memory usage?
将本地动态数组的长度设置为零(当不再需要时)对内存使用有好处吗?
例如:
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;
是的,当您将动态数组的长度设置为零时,如果没有其他 variable/object 引用该内存(不一定返回 Windows 内存,因此您可能看不到任务管理器中的好处,但您的 Delphi 程序需要从 Windows 分配额外内存需要更长的时间,因为它将首先使用可用的堆内存,您已将“MyArray”的大小添加到其中)。
在Delphi中,dynamic arrays被引用计数。
因此,如果您这样做
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
无论如何都会在下一行代码中超出范围,这也减少了堆对象的引用计数。
将本地动态数组的长度设置为零(当不再需要时)对内存使用有好处吗?
例如:
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;
是的,当您将动态数组的长度设置为零时,如果没有其他 variable/object 引用该内存(不一定返回 Windows 内存,因此您可能看不到任务管理器中的好处,但您的 Delphi 程序需要从 Windows 分配额外内存需要更长的时间,因为它将首先使用可用的堆内存,您已将“MyArray”的大小添加到其中)。
在Delphi中,dynamic arrays被引用计数。
因此,如果您这样做
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
无论如何都会在下一行代码中超出范围,这也减少了堆对象的引用计数。