![]() |
Geeignete Variablenübergabe Const oder nicht Const ?
Hallo,
ich hatte bisher versucht bei allen Prozeduren/Funktionen die Variablen, wenn nicht "var" sinnvoll war, als "const" zu übergeben. Nun haben mich meine Kollegen darauf aufmerksam gemacht das es nur bei Strings, Variant, Records, Arrays also komplexen Daten sinnvoll ist. Bei allen anderen Zahlen, Datum, Logisch wäre die Ablaufgeschwindigkeit langsamer (wenn ich es richtig verstanden habe ein Takt mehr). Außerdem sollte man möglichst auf Bytes als Typ verzichten da es weder Speicher spart noch schneller ist im Gegenteil auch hier ist es langsamer da alles auf Integer ausgerichtet ist. Bin gespannt welche Meinungen es dazu gibt. :?: Mfg. :zwinker: Frank |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Um es etwas zu präzisieren:
Was macht const? Wo ist der Vorteil? Und wann setzt man es ein? |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Wenn du wirklich auch noch das letzte Quentchen an Tempo rausquetschen willst schau dir mal die unterschiedlichen Prozedur/Funktionsaufrufe mit unterschiedlichen Parameterübergaben im CPU-Fenster an.. da siehst du dann ganz genau wie der Compiler deinen Code umgesetzt hat und was effizienter ist. Generell wird bei const-Parametern ähnlich wie bei var-Parametern, eigentlich immer nur ein Pointer übergeben. Ich hab jedoch die Beobachtung gemacht, dass bei einem Record ebenfalls immer (egal ob var, const oder normal) nur ein Pointer übergeben wird, und nur wenn der Record in der Prozedur geändert wird wird eine lokale Kopie des Records am Stack angelegt...
Strings sind sowieso auch immer nur Pointer (zumindest die LongStrings) und werden daher auch immer nur als solche übergeben... |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Hallo Luckie,
ist die Frage ernst gemeint ? Wie auch immer so verstehe ich Const: Bei "Const" wird nur die Adresse einer Variable übergeben ebenso bei "Var" nur das man nicht wie bei "Var" den Inhalt der Variable verändern kann. Oftmals will ich Quellvariable nicht verändern dann also "Const". Der eingentliche Vorteil dieser beiden Übergabemöglichkeiten ist die höhere Geschwindigkeit bei großen Strings etc. es wird nur die Adresse und nicht die Daten übergeben. Mfg. Frank :mrgreen: |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Ich denk mal, const ist dann schneller, wenn die Größe des Parameters größer als 32Bit ist. Also vor allem bei Records.
Das Phänomen mit den Records, das Motzi beschrieben hat, lässt womöglich auf Delphis Codeoptimierung zurückführen. |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Zitat:
|
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Moin Frank,
auch wenn es nicht ganz auf das hinausgeht, was Du meinst: Wenn ich mir API Funktionen deklariere, verwende ich, im Gegensatz zu Borland, oder den JEDIs, immer const Parameter, da diese den Gegebenheiten in C eher entsprechen, und man somit auch Codesamples leichter nach Delphi übersetzen kann. |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Const hat die Bedeutung das der uebergebene Parameter in der Funktion nicht aendern kann.
Entsprechend ist eine Zuweisung in der Funkton auch nicht moeglich. Dem Compiler erlaubt dies weitergehende Optimierungen. Zusatzlich nutzt Delphi die read-only Eigenschaft um bei allen Parametern mit mehr als 4 Bytes diesen mit call-by-reference zu uebergeben. Es wird also nur der Zeiger auf die Variable statt der ganzen Variablen auf den Stack gelegt. Konsequenterwise ist jeder Zugriff in der Funktion nun mit einer Dereferenzierung verbunden. Ueblicherweise kommt dabei doch ein Nettogewinn an Geschwindigkeit heraus, besondrs wenn die Variable viele Bytes hat. Das ist der gleiche Mechanismus wie bei var, aber da darf und will man auch schreibend zugreifen. :warn: |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
Hallo Luckie,
war nicht böse gemeint habe mich nur gewundert das bei deinen Status (Anzahl der Beiträge, Moderator) nach dieser Grundlage gefragt wurde. Oder wollest Du keine Erklärung sondern ich meine Frage besser formulieren ? :?: Mfg. :angle: Frank |
Re: Geeignete Variablenübergabe Const oder nicht Const ?
@Christian, const an Objekten als Parameter von Events kann Probleme bescheren wenn man eine Delphi-Komponente in BCB installiert.
Der Compiler faengt an zu meckern. Ich habe gerade an meiner HID-Komponente deshalb ein paar const's abmontiert. In C impliziert const kein call-by-reference, da C call-by-reference nicht kennt. Bei Zeigern in C ist auch eine feinere const-Anwendung moeglich als in Delphi. "const char *p", "char const *p" und "const char const *p". Mal kann man nun den Zeiger nicht veraendern oder nicht die Daten auf die der Zeiger zeigt oder weder das eine noch das andere. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz