如果我通过在pascal中为它分配一个非初始化数组来清除我的数组,那么会发生什么不好的事吗?

Vin*_*nys 2 delphi pascal freepascal

在pascal中,我敢于清理阵列的唯一方法就是简单地遍历它并清除它,但效率非常低.我不能简单地通过为它分配一个空数组来重新初始化它吗?

program arrays;
  var
    working, empty : array [1..10] of integer;
begin
  working[3] := 5;
  working:= empty;
end.
Run Code Online (Sandbox Code Playgroud)

可以这样做,这可能适得其反吗?

Arn*_*hez 7

如果要清除数组,请编写:

working:= empty;
Run Code Online (Sandbox Code Playgroud)

实际上将做结算,通过复制empty数组的内容到working......你的情况empty是无效的,因为它是一个全局变量,其中0这样初始化.

恕我直言,定义这样的全局变量不是一个好习惯.在大多数情况下,全局变量是邪恶的(除非你知道你在做什么),并且在声明它们用0初始化的情况下没有意义.

实际上,如果empty在堆栈上初始化(即var在方法内),则在此时堆栈中的任何内容都填充,即一些随机数据.

如果要快速初始化一个不包含任何引用计数类型的数组(如string),可以编写:

fillchar(working,sizeof(working),0);
Run Code Online (Sandbox Code Playgroud)

如果您的数组包含托管类型,您可以编写:

finalize(workingWithStringInside); // to safely release internal managed types
fillchar(workingWithStringInside,sizeof(workingWithStringInside),0);
Run Code Online (Sandbox Code Playgroud)

这是更快的代码(比变量拷贝更快),听起来更好.


Dav*_*nan 5

这绝对没问题.代码的语义正是您所需要的.当然,Delphi编译器会发出代码来执行简单而有效的内存复制.编译器能够这样做,因为你有一个固定长度的数组,其元素是简单的值类型.如果FPC没有产生非常相似的代码,我会感到惊讶.

即使您的数组包含托管类型(它没有),赋值运算符也会产生尊重这些托管类型的代码.

作为最终评论,充满零的数组应该是常量.

  • 确实如此.如果你想避免保留额外的数组,那么你可以使用`FillChar`.只要您的数组包含值类型,哪个就没问题. (3认同)
  • 那么,我想我会以这种方式清除数组,但是,我相信它不是那么有效,因为它使用了两倍的内存,对吧? (2认同)
  • @MarjanVenema我个人不会.我个人会这样写:`TArray.Initialise <Integer>(working,0);`使用我自己的`TArray`类,它使用一堆有用的静态类方法扩展`Generics.Collections.TArray`. (2认同)