Автор: main
Для упрощения и оптимизации некоторых операций с 32-битными переменными в Delphi, могу посоветовать определить вот такой тип.
PVar32 = ^TVar32; TVar32 = record case Integer of 00:( AsCardinal :Cardinal ); 01:( AsInteger :Integer ); 02:( AsSingle :Single ); 03:( AsFloat :Single ); 04:( AsPointer :Pointer ); 05:( AsTObject :TObject ); 06:( AsLongBool :LongBool ); 07:( AsProcedure :procedure ); 08:( Byte0,Byte1,Byte2,Byte3 :Byte ); 09:( ShortInt0,ShortInt1, ShortInt2,ShortInt3 :Shortint ); 10:( Word0,Word1 :Word ); 11:( SmallInt0,SmallInt1 :SmallInt ); 12:( AsPByte :^Byte ); 13:( AsPWord :^Word ); 14:( AsPCardinal :^Cardinal ); 15:( AsPChar :PChar ); 16:( AsPInteger :^Integer ); 17:( AsPSingle :^Single ); 18:( AsPFloat :^Single ); 19:( AsPDouble :^Double ); 20:( Next :PVar32 ); 21:( AsPVar32 :PVar32 ); // и т.д. ... // 22:( AsStek :TStek ); 99:( _Byte0 :Byte; Word12 :Word; _Byte3 :Byte ); end; |
Вот некоторые примеры использования:
1) например, если нужно проверить равенство двух Single-переменных, и при этом никакие другие операции с ними не планируются, то их не обязательно загружать и сравнивать в FPU, а можно просто сравнить как целочисленные переменные:
if TVar32(Var1).AsInteger=TVar32(Var2).AsInteger then Exit; |
2) можно напрямую обратиться к конкретному байту:
with TVar32(Color) do Byte3 := ( Byte0 + Byte1 + Byte2 ) div 3; |
3) можно даже напрямую обратиться к среднему слову(Word):
var w :Word; i :integer; begin i := ... w := TVar32(i).Word12; |
и т.д. ...
15 октября 2009
Категории: Delphi, переменные
Обновление: 9 декабря 2009