德尔福有:
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,因为记录不得更改。
问题是:
如果我坚持将buffer
参数声明IntDivide
为 asconst
是否有更简洁的编码方式,或者我是否陷入了 pointer_to/points_to hack?