我的结构定义如下:
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
程序的效果?
答案 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)
除了关于FillChar
和ZeroMemory
(内部只是调用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中使用它: