Подтвердить что ты не робот

Как я могу быстро очистить запись простейших типов?

У меня есть структура, определенная следующим образом:

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?

4b9b3361

Ответ 1

вы можете использовать процедуру ZeroMemory, расположенную в модуле Windows.

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

Ответ 2

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

Ответ 3

Вы должны использовать стандартную функцию языка Delphi Default()!

const
  MaxSignalRecords = 255;

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

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

И не взломать.. как предлагалось раньше.

Ответ 4

В дополнение к тому, что было сказано о FillChar и ZeroMemory (которое внутри просто вызывает FillChar), вы можете уменьшить размер своей записи, используя bsignal: set of 1..6; вместо отдельных логических элементов, которые должны ускорить очистку.

Ответ 5

Вы можете использовать SecureZeroMemory

Чтобы избежать нежелательных эффектов оптимизации компиляторов, используйте Функция SecureZeroMemory.

Функция SecureZeroMemory заполняет блок памяти с нулями. это предназначенная для более безопасной версии ZeroMemory.

Используйте эту функцию вместо ZeroMemory, если вы хотите обеспечить что ваши данные будут перезаписаны оперативно, поскольку компилятор может оптимизировать вызов ZeroMemory, удалив его полностью.

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

LE: здесь вы можете использовать его в Delphi, если ваша версия не содержит его:

Использование SecureZeroMemory в Delphi