AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Sender als const?

Ein Thema von Pseudemys Nelsoni · begonnen am 25. Feb 2005 · letzter Beitrag vom 25. Feb 2005
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

Sender als const?

  Alt 25. Feb 2005, 02:47
Moin,

Standardmässig sind Sender ja ohne "const"(siehe TNotifyEvent), hätte das irgendein Nachteil in meinen eigenen methoden wenn ich selbiges dort benutze? also "const Sender: TObject" ? Bzw hätte dies einen Vorteil?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

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
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Sender als const?

  Alt 25. Feb 2005, 03:02
Nachteil: Du kannst nur noch lesend auf den Sender zugreifen
Vorteil: Du kannst nur noch lesend auf den Sender zugreifen

Kommt halt drauf an was du vor hast, und ob dich der Compiler daran hindern soll am Sender zu fummeln. Ein var dürfte im Übrigen keinen Unterschied zur modifikatorlosen Deklaration machen, da eh nur eine Referenz übergeben wird, und bei Objekten, anders als bei Strings und Records, auch keine Duplikate im Hintergrund erzeugt werden (beim ersten schreibenden Zugriff innerhalb der betr. Methode).

Also macht es nur dann und dafür Sinn, wenn du sicher stellen willst, dass am Sender-Objekt nichts verändert werden kann.
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#4

Re: Sender als const?

  Alt 25. Feb 2005, 07:25
Zitat von dizzy:
Ein var dürfte im Übrigen keinen Unterschied zur modifikatorlosen Deklaration machen, da eh nur eine Referenz übergeben wird
Doch es macht einen Unterschied. Du kannst nämlich dann ein neues Objekt zurückgeben.

Beispiel:

Delphi-Quellcode:
procedure Test(sender: TObject);
begin
  Sender:=nil;
end;

procedure Test2(var sender: TObject);
begin
  Sender:=nil;
end;

var
  TestObject: TObject;
begin
  TestObject:=TObject.Create;

  Test(TestObject); // Nach dem Aufruf zeigt TestObject immer noch auf das erstellte Object

  Test2(TestObject); // Nach dem Aufruf zeigt TestObject auf nil.
end.
1. Probiere es doch einfach aus, ob du bei einem TNotfifyEvent ein const einbauen kannst. Ich glaube nämlich nicht, da sich die Aufrufe intern unterscheiden. Und bei Objekten macht es keinen Unterschied. Mit Const übergibt er die 4 Bytes Referenz auf die Variable ohne const übergibt er die 4 Bytes Referenz auf das Objekt selber. Du hast also nichts gewonnen.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
16.805 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Sender als const?

  Alt 25. Feb 2005, 08:26
Zitat von dizzy:
Nachteil: Du kannst nur noch lesend auf den Sender zugreifen
Ist nicht ganz genau. Du kannst den Referenzzeiger nicht verändern, sprich die Speicherstelle wo der Zeiger gespeichert ist. Das Objekt ansich kannst Du ganz normal über Property-Set-Methoden verändern.

Vorteil von const bei String/Widestring und array-Parametern ist, das das Programm kleiner und schneller wird. Bei Objekt-Referenzen ist der Vorteil dagegen "nur" das die Referenz nicht geändert werden kann - also Minimal.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#6

Re: Sender als const?

  Alt 25. Feb 2005, 14:18
Moin Leute,

ich weiss schon wo der Unterschied zwischen const/var/keiner angabe ist, meine Frage bezog sich mehr auf, ob es was nützt Pointer (also referenzen) mit const anzugeben

Aber ich denke so wie sich das hier anhörte tut es das nicht


Was tut const eigentlich genau? Eine kopie der variable wird ja nicht angelegt, kann ich also davon ausgehen das es auch eine referenz ist die man nur nicht ändern kann?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf