Wie schon richtig gesagt wurde, ist "var" mit "out" identisch.
Und beide sind wiederrum mit "const" funktionsweise identisch: Alles eine referenzbasierte Übergabe, im Grunde gleichbedeutend mit einem Zeiger. Lediglich "const" hat die besonderheit, dass der Compiler dem Programmierer den direkten Zugriff auf die Variable verbietet. Das lässt sich aber auch über
ASM umgehen, wenn man es braucht (was nie der Fall sein sollte!). Auch werden "const"-Parameter bei String-Typen ein wenig optimiert (steht so zumindest im DocWiki), ansonsten verhält es sich aber intern exakt wie mit "var" oder "out".
Wer sich ebenfalls etwas mit
ASM in Delphi auskennt, der weiß, dass das Ergebnis, genau wie der erste Parameter einer Funktion, bei 32-Bit immer im EAX-Register übergeben bzw. zurückgegeben wird. Strings und Records werden außerdem IMMER als Referenz übergeben. Insofern ist es völlig belanglos, welche dieser Routinen man benutzt, der Code ist in jedem Fall identisch:
procedure Foo(var X: Integer);
procedure Foo(out X: Integer);
procedure Foo(X: PInteger);
function Foo(const X: Integer): PInteger;