Thema: Delphi Sender als const?

Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Sender als const?

  Alt 25. Feb 2005, 03:01
Guck doch in der Hilfe, was das const bei der Parameterübergabe bewirkt:
Zitat:
Using const allows the compiler to optimize code for structured- and string-type parameters. It also provides a safeguard against unintentionally passing a parameter by reference to another routine.
Bei Strings wird zum Beispiel nur der Referenzzähler erhöht, es wird also keine Kopie angelegt.

Ich zitiere mal aus Motzis String-Tutorial:
Zitat:
“normaler”- und const-Parameter
Deklaration und Aufruf einer Prozedur mit einem “normalen” Parameter:
Delphi-Quellcode:
procedure foo_normal(s: String);
var
s: String;
s := 'Test';
foo_normal(s);
Deklaration und Aufruf einer Prozedur mit einem const-Parameter:

Delphi-Quellcode:
procedure foo_const(const s: String);
var
s: String;
s := 'Test';
foo_const(s);
Auch diese beiden Methoden scheinen auf den ersten Blick identisch, wenn man sich den
erzeugten Assembler-Code für den Aufruf ansieht:
Assembler-Code des Aufrufs der Funktion mit „normalem“ Parameter:

Code:
mov eax, [ebp-$04]
call foo_normal
Assembler-Code des Aufrufs der Funktion mit const-Parameter:
mov eax, [ebp-$04]
call foo_const
Der eigentliche Unterschied wird erst in der aufgerufenen Funktion sichtbar. Während bei
einem const-Parameter dort nichts weiter wichtiges geschieht, findet man bei der Funktion mit
normalem Parameter folgende Code-Blöcke am Anfang:

Code:
push ebp
mov ebp, esp
push ecx
mov [ebp-$04],eax
mov eax,[ebp-$04]
call @LstrAddRef
xor eax,eax
push ebp
push $0046c81e
push dword ptr fs:[eax]
mov fs:[eax],esp
bzw. am Ende der Funktion:
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax],edx
push $0046c825
lea eax,[ebp-$04]
call @LStrClr
ret
jmp @HandleFinally
jmp -$10
Durch diesen Code wird eine lokale Kopie des Strings angelegt, welche dann innerhalb der
Funktion benutzt wird, wodurch der übergebene String davor geschützt wird, verändert zu
werden. Außerdem wird noch extra ein SEH-Frame (SEH = Structured Exception Handling)
angelegt, damit die lokale Kopie des Strings auf jeden Fall am Ende wieder korrekt
freigegeben wird.

Dass das ganze dann natürlich wieder eine Menge Arbeit bedeutet, dürfte jedem einleuchten,
und dass sich diese Mehrarbeit eher schlecht auf das Laufzeitverhalten auswirkt, sollte auch
klar sein. Daher sollten Strings, wenn möglich, immer nur als const-Parameter bzw. wenn sie
von der aufgerufenen Funktion verändert werden sollen, als var-Parameter übergeben werden.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat