AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi (const Param:Integer)oder(Param:Integer)-Unterschied?
Thema durchsuchen
Ansicht
Themen-Optionen

(const Param:Integer)oder(Param:Integer)-Unterschied?

Ein Thema von sniper_w · begonnen am 6. Jul 2005 · letzter Beitrag vom 7. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#1

(const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 22:23
Ich würde gerne mal wissen ,wo genau liegt die Unterschied zwischen zwei Deklarationen:
Delphi-Quellcode:
// Fall 1
function MyFunc(const Param:Integer):Boolean;
und
Delphi-Quellcode:
// Fall 2
function MyFunc(Param:Integer):Boolean;
Soviel ich weiss, im Fall 1 kann man die "Param" Variable in der Funktion nicht ändern, sondern nur deren Wert benutzen.
Im Fall 2 wird eine Lokale Kopie von Param angelegt, und mir der kann man dann alles machen, was man sonst mit einer Variavle machen kann, hat aber keine Auswirkungen nach aussen.

Gibt es noch welche Unterschiede? Und wo ist der Sinn der Sache, const oder nicht const ?
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#2

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 22:25
Übergabe:
Fall 1: Referenz
Fall 2: Wert
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 22:31
function MyFunc(const Param:Integer):Boolean; ist das gleiche wie
function MyFunc(var Param:Integer):Boolean; mit dem großen Unterschied das bei "const" der Wert nicht geändert werden darf/kann.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 22:33
out hast du dann vergessen ... das gehört auch in diese Reihe. In C hingegen ist OUT nur ein leeres Makro.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 22:39
genau, out gibt es auch noch.
Einen Nachtrag noch zu dem Const.
Wenn du folgendes versuchst
Delphi-Quellcode:
function MyFunc(const Param:Integer):Boolean;
begin
  Param := 9;
end;
meckert der Compiler eben weil es ein Constanter Wert ist.

wenn du aber das ganze so machst
Delphi-Quellcode:
function MyFunc(const Param:Integer):Boolean;
begin
  PInteger(@Param)^ := 9;
end;
dann meckert kein Compiler und du siehst das der Übergabewert sich ändert.

wenn du also zweite variante wie folgt aufrufst
Delphi-Quellcode:
var test1: Integer;
begin
  test1 := SpinEdit1.Value;
  ShowThat(test1);
  showmessage(inttostr(test1));
und SpinEdit1.Value = 5 ist, dann
wirst du bei deinem ShowMessage dann sehen das test1 auf einmal 5 ist weil das const überlistet wurde. Und genau dafür ist Const eigentlich da, damit sowas nicht passiert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 23:02
Zitat von SirThornberry:
und SpinEdit1.Value = 5 ist, dann
wirst du bei deinem ShowMessage dann sehen das test1 auf einmal 5 ist
Da stimmt doch was nicht. Wenn ich beim SpinEdit eine 5 einstelle und dann nach deiner Theorie dann doch eine 5 sehe, obwohl nach deiner Theorie ein 9 da stehen muss, dann kann da doch was nicht stimmen

Das const hat bei Integer nur die Wirkung, dass der Compiler den Parameter nicht verändern lässt. Er wird aber immernoch mit ByValue übergeben. const hat hauptsächlich bei Strings eine besondere Bedeutung. Fehlt es dort nämlich, muss der Compiler einen try/finally Block aufbauen, der die Referenzzählung des Strings verwaltet. Ansonsten könnte man ja den String nach außen hin verändern (Seiteneffekt). Und genau hier ist das const eine Optimierung, die einiges an Geschwindigkeit aus so manchen Programmen herausholen kann.

Probiert mal folgenden Code einmal ohne "const" und dann mit aus. Da braucht man nicht mal einen Profiler um den Geschwindigkeitsunterschied feststellen zu können. Ein Breakpoint
Delphi-Quellcode:
procedure Stupid({const} S: string);
begin
  Length(S); // damit da nichts wegoptimiert wird
end;

procedure DoSomething;
var
  A: string;
  i: Integer;
begin
  A := 'Hallo';
  A := A + ' du da'; // damit A keinen Konstanten-Referenzzähler hat (=-1)
  for i := 0 to 50000000 do
    Stupid(A);
end;

initialization
  DoSomething; // hier Breakpoint setzen (F5), Programm staten (F9) und drüber steppen (F8)

end.
Vorausgesetzt ist natürlich immer, dass man die String-Parameter in der Funktion auch nicht ändert, also ein const überhaupt möglich ist.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 23:07
ich kenn den unterschied, ich wollte damit nur die wirkungsweise von const demonstrieren, nämlich das eine referenz übergeben wird und keine kopie, und das konnte man wunderbar demonstrieren in dem man das const "ignoriert" und den wert innerhalb der funktion ändert.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 23:25
Zitat von SirThornberry:
function MyFunc(const Param:Integer):Boolean; ist das gleiche wie
function MyFunc(var Param:Integer):Boolean; mit dem großen Unterschied das bei "const" der Wert nicht geändert werden darf/kann.
Das Unterschied ist auch im Aufruf:
Fall 1:MyFunc(3);//<-OK Fall 2:MyFunc(3);//<-Fehler
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 6. Jul 2005, 23:35
Zitat von SirThornberry:
ich kenn den unterschied
Womöglich doch nicht, oder du beziehst dich auf einen anderen Datentyp als Integer.
Zitat:
ich wollte damit nur die wirkungsweise von const demonstrieren, nämlich das eine referenz übergeben wird und keine kopie
Das hängt vom Datentyp des Parameters ab. Bei Integern wird bei const trotzdem eine Kopie auf den Stack gelegt:
Code:
mov eax, [MyInteger] // Wert von MyInteger in eax (=1. Parameter bei register-Call)
call DoSomeWildThings
Bei einem CallByRef müsste der Code so aussehen:
Code:
mov eax, OFFSET MyInteger // Adresse von MyInteger in eax (=1. Parameter bei register-Call)
call DoSomeWildThings
Oder alternativ:
Code:
lea eax, MyInteger // Adresse von MyInteger in eax (=1. Parameter bei register-Call)
call DoSomeWildThings

Bei Arrays und Records stimmt deine Aussage. Eine Faustregel ist: Alles was sich in 4 Bytes reinquetschen lässt, wird bei const als Kopie auf den Stack übergeben. Alles andere geht als Zeiger auf den Stack.

Zitat:
und das konnte man wunderbar demonstrieren in dem man das const "ignoriert" und den wert innerhalb der funktion ändert.
Das funktioniert bei Integer aber nicht. Egal wierum man das Blatt wendet.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

Re: (const Param:Integer)oder(Param:Integer)-Unterschied?

  Alt 7. Jul 2005, 19:58
Komich, als ich aber per Pointer zugriff in der Funktion den Integer der mit Const übergeben wurde geändert hab wurde auch der Original-Integer geändert. Wohlmöglich sehen bei dir die Assemblerbefehle nur anders aus weil in deinem Beispiel etwas optimiert wird. Wenn ich nicht über den Umweg von SpinEdit1.Value sondern den Value fest in den Source codiere dann klappt das auch nicht weil dann durch die optimierung der Wert direkt übergeben wird ohne die Variable.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz