如何快速清除简单类型的记录?

时间:2011-04-01 05:10:08

标签: delphi

我的结构定义如下:

const
  MaxSignalRecords=255;
type
  TSignalRecord=record
   signal1  : integer;
   signal2  : integer;
   signal3  : integer;
   signal4  : integer;
   signal5  : integer;
   signal6  : integer;
   bsignal1 : Boolean;
   bsignal2 : Boolean;
   bsignal3 : Boolean;
   bsignal4 : Boolean;
   bsignal5 : Boolean;
   bsignal6 : Boolean;
  end;

TListSignals = Array[0..MaxSignalRecords-1] of TSignalRecord;

此结构用于在如下算法中进行数千次计算:

for i:=1 to 900000 do
begin
  CleartheList(MyList);
  DotheMath(MyList);
  DotheChart(MyList);
end;

我正在寻找一种快速方法,将TListSignals的值初始化为0和false

现在我正在使用它:

procedure ClearListSignals(var ListSignals:TListSignals);
var
  i :Integer;
begin
  for i := 0 to MaxSignalRecords - 1 do
  with ListSignals[i] do
  begin
   signal1   :=0;
   signal2   :=0;
   signal3   :=0;
   signal4   :=0;
   signal5   :=0;
   signal6   :=0;
   bsignal1  :=false;
   bsignal2  :=false;
   bsignal3  :=false;
   bsignal4  :=false;
   bsignal5  :=false;
   bsignal6  :=false;
  end;
end;

如何改善ClearListSignals程序的效果?

5 个答案:

答案 0 :(得分:29)

您可以使用ZeroMemory单元中的Windows程序。

var
  MyList : TListSignals;
begin
     ZeroMemory(@Mylist,SizeOf(MyList));
end;

答案 1 :(得分:22)

你应该使用标准的Delphi语言函数Default()!

const
  MaxSignalRecords = 255;

type
  TSignalRecord = record
    ...
    bsignal6 : Boolean;
  end;

var
  X: TSignalRecord
...
X := Default(TSignalRecord);
...

没有黑客......如前所述......

答案 2 :(得分:13)

FillChar(ListSignals, SizeOf(ListSignals), 0);

答案 3 :(得分:10)

除了关于FillCharZeroMemory(内部只是调用FillChar)的内容之外,您可以使用bsignal: set of 1..6;而不是单个布尔值来缩小记录的大小。应该加快清算速度。

答案 4 :(得分:3)

您可以使用SecureZeroMemory

  

避免不良影响   优化编译器,使用   SecureZeroMemory功能。

     

SecureZeroMemory函数填充了   带零的内存块。它是   旨在成为更安全的版本   ZeroMemory。

     

使用此功能代替   ZeroMemory,当你想要确保   您的数据将被覆盖   及时,因为编译器可以优化   通过删除它来调用ZeroMemory   完全。

http://msdn.microsoft.com/en-us/library/aa366877%28v=vs.85%29.aspx

LE:如果您的版本不包含它,您可以在Delphi中使用它:

Using SecureZeroMemory in Delphi