Zitat von
hoika:
Hallo,
Wird nicht seit D2 eh nur eine Zeiger übergeben ?
Heiko
Stimmt schon (weiß zwar nicht mehr seit wann), aber trotzdem passiert Speicherverwaltungstechnisch eine ganze Menge mehr, wenn der Parameter lokal verändert werden darf.
Aus
Delphi-Quellcode:
function test1(const s:string; sep:char) :string;
begin
Result := S;
end;
wird kurz und knapp
Code:
Main.pas.106: begin
push ebx
push esi
mov esi,ecx
mov ebx,eax
Main.pas.107: Result := S;
mov eax,esi
mov edx,ebx
call @UStrAsg
Main.pas.108: end;
pop esi
pop ebx
ret
dagegen bläht sich
Delphi-Quellcode:
function test2(s:string; sep:char) :string;
begin
Result := S;
end;
ganz fürchterlich zu
Code:
Main.pas.101: begin
push ebp
mov ebp,esp
push ecx
push ebx
mov ebx,ecx
mov [ebp-$04],eax
mov eax,[ebp-$04]
call @UStrAddRef
xor eax,eax
push ebp
push $004a3bcc
push dword ptr fs:[eax]
mov fs:[eax],esp
Main.pas.102: Result := S;
mov eax,ebx
mov edx,[ebp-$04]
call @UStrAsg
Main.pas.103: end;
xor eax,eax
pop edx
pop ecx
pop ecx
mov fs:[eax],edx
push $004a3bd3
lea eax,[ebp-$04]
call @UStrClr
ret
jmp @HandleFinally
jmp $004a3bc3
pop ebx
pop ecx
pop ebp
ret
aus. Man muss das ja nicht alles verstehen, aber bei zeitkritischen Sachen summiert sich das ganz erheblich und man sollte es im Hinterkopf behalten. Ich schreibe inszwischen bei Strings ganz automatische immer const davor.