Autor |
Beitrag |
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 24.01.05 21:35
Bin bei meinen ASM-Exkursen auf eine witzige Idiotie des Delphi-Compilers gestoßen:
Warum werden CONST-Parameter als Lokale Variablen behandelt, d.h. im Stackframe abgelegt, und nicht einfach als Referenz übergeben?
Nervt mich nämlich, wenn ich einen Wert in einer Routine nicht veränder, aber trotzdem zum Umgehen immer einen VAR-Parameter brauch ...
Was haben die Borland-Entwickler sich dabei gedacht?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
uall@ogc
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mo 24.01.05 21:47
vill mal nen BSP damit man den 2. satz von dir mit dem 1. verbinden kann
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mo 24.01.05 22:47
uall@ogc hat folgendes geschrieben: | vill mal nen BSP damit man den 2. satz von dir mit dem 1. verbinden kann |
Siehe 3. Satz
Ne im ernst:
Normalerweise wäre es doch logisch, dass man alle Parameter, die man in einer Routine nicht verändert, mit CONST kennzeichnet, um dem Compiler mitzuteilen, "kannst du getrost by Ref übergeben, da ändert sich nichts dran" ...
Die Borland-Implementation behandelt CONST-Parameter aber genauso, wie als wenn man nichts, d.h. by Value die Werte übergibt (Erzeugt also eine Kopie der Werte auf dem Stack).
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
UC-Chewie
Beiträge: 531
WinXP
D5 Ent
|
Verfasst: Mi 26.01.05 13:27
const muss unterschieden werden bei elementaren Typen und zusammengesetzten.
Bei elementaren (Integer, Bool, etc.) ist ein zeiger in der Regel auch nicht kleiner als der Wert selbst - folglich verlangsamt das anlegen einer Kopie dein Programm nicht.
Bei komplexen Typen ist das anders. Irgendwo in der Delphi-Hilfe ist erklärt, wie die Übergabe genau abläuft (Stichwort: Paranmeterübergabe oder so ähnlich).
_________________ Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
|
|
tommie-lie
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Mi 26.01.05 18:28
const hat semantisch keine weitere Bedeutung. Man kann nur innerhalb der Funktion nicht zugreifen (AFAIK Compilerfehler), und um das auch in selbstgeschriebenen Assembler-Routinen sicherzustellen, ist es auch nur konsequent, es als Wert zu übergeben, und nicht als Referenz. Immerhin hat der Compiler keinerlei Einfluss darauf, was du als Programmierer da machst, wenn du in Assembler programmierst. Würde der Parameter by Reference übergeben werden, könntest du ohne weiteres den Wert ändern, und der Caller fragt sich dann, was da schon wieder schiefgelaufen ist.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
BenBE
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 26.01.05 22:01
k, hab mich nur gewundert ... Weil CONST den blöden Nebeneffekt hat, dass es Stackframes erzeugt und beim übergeben von Extended-Perten pro Parameter 3, bzw. bei meinen TVector3D-Strukturen 8 Pushes auf dem Stack tätigt, was den Effekt der ASM-Optimierung schon fast wieder zu nichte macht.
Habs jetzt aber als VAR-Parameter implementiert, auch, wenn's mich nervt, dass ich dann keine direkte Übergabe von einem Funktionsergebnis als Parameter für die Nächste Funktion machen kann. Aber bei $W- hält sich der Overhead ja in Grenzen
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
|