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 ハックで立ち往生しているのかということです。 buffer
IntDivide
const