Delphi ha:posso forzare `const` di passare per riferimento (aka il parametro mancante` tale dicitura)
var
: passare riferimento; parametro è sia input che output.
out
: passaggio per riferimento; il parametro è solo in uscita.
const
: passare da ..... beh dipende; parametro è solo input.
in
: passare per riferimento; il parametro è solo input e non verrà modificato non c'è "in".
Non mi interessa che there is no spoon, ma mi manca in
; considerando il seguente codice, c'è un modo più pulito per farlo?
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
{Modifica del codice a imul ecx;...;shr r9,32;mov ecx,r9d
permetterebbe passaggio per valore, ma supponiamo che il codice non deve essere modificato.}
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
non cambierà mai il buffer. L'intero punto della routine è che buffer
è un valore precalcolato che non cambia.
Nell'operatore di classe dichiaro il buffer come const, poiché il record non deve cambiare.
La domanda è:
se insisto sulla proclamazione del parametro buffer
in IntDivide
come const
c'è un modo più pulito di codifica o sono io bloccato nel pointer_to/points_to incidere?
Cosa significa "in"? Quello che manca davvero è C++ 'const MyType & value' –
' in' sarebbe l'opposto di 'out', passa per riferimento ma il parametro è garantito per non cambiare; e sì, un puntatore (noto anche come pass_by_reference) che non verrà modificato all'interno della routine. – Johan