Autor Beitrag
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mo 24.01.05 21:47 
vill mal nen BSP damit man den 2. satz von dir mit dem 1. verbinden kann
BenBE Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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 :P

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.