Будут ли константные параметры и приведение типов работать, как прежде, в 64-битной версии Delphi?

Как правило, я обходил множество классических ловушек проектирования при использовании указателей, используя преимущества параметров Const (нетипизированные), а не жестко закодированных типов. Это дает мне преимущество скорости при выполнении расширенных графических функций, оставляя технические детали на усмотрение компилятора. Это также упростило использование одного и того же кода в Delphi и Free Pascal с минимальными изменениями. Однако в последнее время я начал сомневаться в этом из-за Embarcadero ' s vauge заявления об эволюции Delphi и его будущей модели безопасности.

Например, рассмотрим следующий пример:

Type TSomeDataProc = procedure (const aInput;var aOutput) of Object;

(* Convert 8-bit pixel to 16-bit pixel *)
Procedure TMyClass.ProcessSomeData08x565(Const aInput;var aOutput);
var r,g,b: Byte;
Begin
  FPalette.ExportTriplets(Byte(aInput),r,g,b);
  Word(aOutput):=(R SHR 3) SHL 11 or (G SHR 2) SHL 5 or (B SHR 3);
End;

(* Convert 16-bit pixel to 24-bit pixel *)
Procedure TMyClass.ProcessSomeData565x888(Const aInput;var aOutput);
Begin
  With TRGBTriple(aOutput) do
  Begin
   rgbtRed:=(((word(aInput) and $F800) shr 11) shl 3);
   rgbtGreen:= (((word(aInput) and $07E0) shr 5) shl 2);
   rgbtBlue:= ((word(aInput) and $001f) shl 3);
  end;
End;

Теперь у нас есть две процедуры с идентичными объявлениями, но они по-разному обрабатывают пиксельные данные. Это дает нам преимущество использования таблицы поиска для получения правильного метода «преобразователя». Это следует делать либо в конструкторе, либо там, где размещено растровое изображение, например:

Private
FLookup: Array[pf8bit..pf32bit,pf8bit..pf32bit] of TSomeDataProc;

Procedure TMyClass.Create;
Begin
  Inherited;
  FLookup[pf8bit,pf16bit]:=ProcessSomeData08x565;
  FLookup[pf16bit,pf24Bit]:=ProcessSomeData565x888;
end;

Когда нам нужно преобразовать пиксели, мы просто ищем правильный метод и используем его. Синтаксис остается одинаковым для всех процедур, поэтому нам не нужно беспокоиться о том, «как» работает каждая процедура. Что касается нашего класса, все они выглядят одинаково.

Procedure TMyClass.ConvertTo(aFormat:TpixelFormat);
Begin
 // Get function for the correct pixel converter
 FConvertProc:=FLookup[CurrentFormat,aFormat];

 //Use the pixel converter
 FConvertProc(GetSourcePixelAddr(x,y),GetTargetPixelAddr(x,y));
end;

Вопрос: Будет ли такое приведение типов (например: Const to Byte или любой определенный тип записи) выжить в 64-битной версии? Я лично не понимаю, почему бы и нет, но Embarcadero в некоторой степени расплывчато высказывались относительно новой модели «безопасности» и использования указателей, поэтому мне немного сложно защитить свой код на будущее.

7
задан Jon Lennart Aasenden 2 February 2011 в 06:43
поделиться