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)
可以这样做,这可能适得其反吗?
如果要清除数组,请编写:
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)
这是更快的代码(比变量拷贝更快),听起来更好.
这绝对没问题.代码的语义正是您所需要的.当然,Delphi编译器会发出代码来执行简单而有效的内存复制.编译器能够这样做,因为你有一个固定长度的数组,其元素是简单的值类型.如果FPC没有产生非常相似的代码,我会感到惊讶.
即使您的数组包含托管类型(它没有),赋值运算符也会产生尊重这些托管类型的代码.
作为最终评论,充满零的数组应该是常量.
| 归档时间: |
|
| 查看次数: |
2655 次 |
| 最近记录: |