Entwickler-Ecke

Sonstiges (Delphi) - Leerzeichen beeinflussen DCU-Länge?


Mathematiker - Fr 23.01.15 12:43
Titel: Leerzeichen beeinflussen DCU-Länge?
Hallo,
ich demonstriere vielleicht wieder mein Nichtwissen, da es jeder weiß, nur ich nicht, aber mir ist gerade etwas Merkwürdiges aufgefallen.
Kompiliere ich z.B. Texte mit

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  if ... then 
  begin
    ...
  end
  else
  begin
    ...
  end;

und anschließend in der Form

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
  if ... then begin
    ...
  end
  else begin
    ...
  end;

so hat die dcu-Datei eine andere Länge, oft kürzer, aber nicht immer. Konkret wurde gerade die DCU 62 Byte kürzer, als ich das else direkt hinter das end gesetzt habe und nicht in eine neue Zeile.
Das Gleiche geschieht bei for-to-do-Schleifen, aber auch wenn ich bei

Delphi-Quelltext
1:
    irgendeineanweisung                    

nur die voranstehenden Leerzeichen verändere z.B.

Delphi-Quelltext
1:
 irgendeineanweisung                    

Der gleiche Effekt tritt auf, wenn eine Leerzeile entfernt oder hinzugefügt wird.
Wie ist so etwas möglich? Theoretisch muss doch der gleiche Text übersetzt werden, d.h. auch mit dem gleichen Ergebnis.
Und weiter gedacht: Das bedeutet doch, dass der gleiche Quelltext je nach Formatierung unterschiedliche Exe-Längen ergibt.
Oder ist das nur ein Effekt, der bei D5 und D7 auftrat. Aber warum?
Ich verstehe die Logik dahinter nicht. Einmal wird die Datei größer, manchmal auch kleiner, ohne dass auch nur eine Anweisung wirklich verändert wurde.

Ich bin wieder ratlos.
Mathematiker


Delete - Fr 23.01.15 13:04

Lieber Mathematiker,

das wird wohl, soweit ich das zu beurteilen vermag, an deiner alten Delphi-Version liegen. Zumindest konnte ich dieses Phänomen mit Delphi 2009 nicht nachvollziehen, während ich eben mal kurz durch mehrfaches Suchen&Ersetzen alle doppelten Leerzeichen in einfache umgewandelt und danach alle Projekte neu erzeugt hatte. Die Größe der DCU-Datei zumindest dieser einen Unit blieb im Debug- bzw. im Release-Modus stets die jeweilige, ebenso die Größe der jeweiligen Exe-Datei.

Sind denn bei dir auch die EXE-Größen unterschiedlich, wenn du lediglich Leerzeichen in deinen Units entfernst oder hinzufügst? Denn letztendlich kommt es, wenn überhaupt, auf die Größe des ausführbaren Programms in der Release-Version an, denn die ist es ja schließlich, die du eventuell weitergibst.


Mathematiker - Fr 23.01.15 13:15

Ok, vielleicht sollte ich erst einmal nachdenken, bevor ich hier etwas hineinschreibe. :autsch:

Die Ursache sind die zugeschalteten Debugger-Informationen. Nehme ich die heraus, ändert sich nichts mehr, die DCU bleibt gleichgroß.
Merkwürdig finde ich aber dennoch, dass die Debugger-Informationen diesen Einfluss haben.

Sorry für die blöde Anfrage :oops:
Mathematiker


jaenicke - Fr 23.01.15 13:48

user profile iconMathematiker hat folgendes geschrieben Zum zitierten Posting springen:
Merkwürdig finde ich aber dennoch, dass die Debugger-Informationen diesen Einfluss haben.
Naja, da steht drin welche Zeile zu welchem Code gehört, sonst wüsste der Debugger das ja nicht. Wenn man die saubere Variante mit dem begin und end in eigenen Zeilen nimmt, hat man zwei Zeilen mehr, so dass sich diese Information ändert.


mandras - Fr 23.01.15 14:13

Die Anfrage war definitiv nicht blöde.

Ich habe es einmal mit D6 ausprobiert und konnte feststellen, daß bei sonst gleichem Code eine Zeile mehr die DCU um 2 Byte größer macht (mit ausgeschalteter Optimierung)

Variante a:
i:=1; i:=2;

Variante b:
i:=1;
i:=2;


Dies liegt wohl daran, daß in einer DCU auch die Infos enthalten sind, die in der MAP-Datei vorkommen.

Also: Die DCU wird dann größer, wenn die Anzahl Zeilen steigt, die tatsächlich zum Maschinencode beitragen.
Einfach nur Leerzeichen/Zeilen einfügen ergab bei mir keine Änderung der DCU-Größe


Delete - Fr 23.01.15 14:16

user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
Also: Die DCU wird dann größer, wenn die Anzahl Zeilen steigt, die tatsächlich zum Maschinencode beitragen.

Das entlockt mir lediglich die Frage: Na und?