11

Delphiには次のものがあります。

var: 参照渡し; パラメータは入力と出力の両方です。
out: 参照渡し; パラメータは出力のみです。
const: 通りすがり ..... まあ、場合による; パラメータは入力のみです。
in :参照渡し; パラメータは入力のみで、変更されません「中」はありません。

スプーンがなくてもいいのですが、寂しいinです。次のコードを考えると、これを行うためのよりクリーンな方法はありますか?

type TFastDiv = record 
strict private
  FBuffer: Int64;
  other fields
....

//Must be `var` because `const` would pass a Int64 by value
//                      |||
//                      VVV
function DivideFixedI32(var Buffer: Int64; x: integer): integer;
asm  
  mov  r9,rcx                   
  imul dword ptr[rcx]    // do stuff with the buffer
  ..
  mov     ecx, [r9+4]    // do other stuff with the rest of the buffer  

{コードを変更するimul ecx;...;shr r9,32;mov ecx,r9dと値渡しが可能になりますが、コードを変更してはいけないと仮定しましょう。}

class operator TFastDiv.IntDivide(x:integer; const buffer:TFastDiv):integer;
begin
  Result:= DivideFixedI32(Int64((@buffer.FBuffer)^), abs(x)); <<-- Ugly
  if (x < 0) then Result:= - Result;
end;

DivideFixedバッファを変更することはありません。ルーチンの全体的なポイントは、buffer変更されない事前計算された値です。

クラス演算子では、レコードを変更してはならないため、バッファーを const として宣言します。

問題は、パラメーターを
宣言することを主張する場合、よりクリーンなコーディング方法があるか、または pointer_to/points_to ハックで立ち往生しているのかということです。 bufferIntDivideconst

4

2 に答える 2

15

新しいコンパイラ バージョン (XE3 以降) では、[Ref]デコレータがサポートされています。

procedure Foo(const [Ref] Arg1: Integer; [Ref] const Arg2: Byte);

キーワードの前または後に置くことができることを強調するドキュメンテーションから適応された例。[Ref]const

于 2013-09-30T14:39:33.747 に答える