Ответ 1
вы можете использовать процедуру ZeroMemory
, расположенную в модуле Windows
.
var
MyList : TListSignals;
begin
ZeroMemory(@Mylist,SizeOf(MyList));
end;
У меня есть структура, определенная следующим образом:
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
?
вы можете использовать процедуру ZeroMemory
, расположенную в модуле Windows
.
var
MyList : TListSignals;
begin
ZeroMemory(@Mylist,SizeOf(MyList));
end;
FillChar(ListSignals, SizeOf(ListSignals), 0);
Вы должны использовать стандартную функцию языка Delphi Default()!
const
MaxSignalRecords = 255;
type
TSignalRecord = record
...
bsignal6 : Boolean;
end;
var
X: TSignalRecord
...
X := Default(TSignalRecord);
...
И не взломать.. как предлагалось раньше.
В дополнение к тому, что было сказано о FillChar
и ZeroMemory
(которое внутри просто вызывает FillChar), вы можете уменьшить размер своей записи, используя bsignal: set of 1..6;
вместо отдельных логических элементов, которые должны ускорить очистку.
Вы можете использовать SecureZeroMemory
Чтобы избежать нежелательных эффектов оптимизации компиляторов, используйте Функция SecureZeroMemory.
Функция SecureZeroMemory заполняет блок памяти с нулями. это предназначенная для более безопасной версии ZeroMemory.
Используйте эту функцию вместо ZeroMemory, если вы хотите обеспечить что ваши данные будут перезаписаны оперативно, поскольку компилятор может оптимизировать вызов ZeroMemory, удалив его полностью.
http://msdn.microsoft.com/en-us/library/aa366877%28v=vs.85%29.aspx
LE: здесь вы можете использовать его в Delphi, если ваша версия не содержит его: