Delphi posiada:mogę zmusić `const` przechodzić przez odniesienie (aka brakującej` in` parametru)
var
: przechodzić przez odniesienie; parametr jest zarówno wejściowy, jak i wyjściowy.
out
: przekazywać przez odniesienie; Parametr jest tylko wyjściowy.
const
: przejść przez ..... to zależy; Parametr jest tylko wejściowy.
in
: przekazywać przez odniesienie; parametr jest tylko wejściowy i nie zostanie zmieniony nie ma "w".
Nie mam nic przeciwko, że there is no spoon, ale brakuje mi in
; biorąc pod uwagę poniższy kod, czy istnieje czystszy sposób robienia tego?
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
{Zmiana kodu do imul ecx;...;shr r9,32;mov ecx,r9d
pozwoliłoby podanie przez wartość, ale załóżmy, że kod nie musi być zmieniana.}
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
nigdy nie zmieni bufor. Cały punkt rutyny jest taki, że buffer
jest wstępnie obliczoną wartością, która się nie zmienia.
W operatorze klasy deklaruję bufor jako const, ponieważ rekord nie może się zmienić.
Pytanie brzmi:
Gdybym domagać się deklarując parametr w IntDivide
buffer
jako const
istnieje przejrzysty sposób kodowania albo ja utknął w pointer_to/points_to włamać?
Co to jest "w"? Czego tak naprawdę brakuje: C++ 'const MyType & value' –
' in' byłoby przeciwieństwem 'out', przekazywane przez referencję, ale gwarantowany parametr nie ulega zmianie; i tak, wskaźnik (aka pass_by_reference), który nie zostanie zmieniony wewnątrz procedury. – Johan