AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie funktioniert SizeOf() intern?

Ein Thema von SebE · begonnen am 14. Sep 2005 · letzter Beitrag vom 14. Sep 2005
Antwort Antwort
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#1

Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 16:58
Hallo Leute,
wisst ihr, wie man die Größe einer Variable, Konstante oder eines Types herausfindet.

Natürlich: Es gibt SizeOf().

Aber wie funktioniert diese Funktion?
Wird vor einem Speicherbereich etwa immer die Länge/Größe des belegten Speichers angelegt?

Danke für Aufklärung
Sebastian
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#2

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 17:00
Das ist Compiler Magic. SizeOf(Integer) wird automatisch durch eine Konstate mit dem Wert 4 ersetzt. Bei SizeOf(Byte) wäre die Konstante 1. Das einzige, bei dem vor den eigentlichen Daten die Länge und Elementgröße gespeichert wird, sind dynamische Arrays (und auch strings, aber der Unterschied ist nicht besonders groß).
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 17:14
Zitat von Dax:
Das ist Compiler Magic. SizeOf(Integer) wird automatisch durch eine Konstate mit dem Wert 4 ersetzt. Bei SizeOf(Byte) wäre die Konstante 1.
Und wie funktioniert dann
sizeof(TMyRecord);
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 17:25
Mann, Luckie ! Ein Record ist die Addition der zugrundeliegenden Datentypen und deren Größe steht fest ! Ein Array davon wäre dann noch eine Multiplikation der Größe der Records. Nix Compiler Magic. 8)
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 17:53
Darauf wollte ich hinaus. Bleibe mich zu klären, wie die Direktive packed dann brücksichtigt wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#6

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 17:56
Zitat von Hansa:
Nix Compiler Magic.
Das, was du beschrieben hast, ist ausnahmsweise mal richtig, und genau das ist Compiler Magic
Schade drum, wäre echt eine Rarität gewesen.
Wobei nur noch zu erwähnen wäre, daß bei Records zusätzlich noch das Alignment vom Compiler beachtet wird.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 18:27
Man kann ja SizeOf() auf Datentypen, Konstanten oder Variablen anwenden.

So muss es wohl ablaufen
Der Compiler schaut also in seinen Syntaxtree (die Dinge sind intern als Baum organisiert) nach.
Der Baum wird auch als "dekorierter Syntaxbaum" bezeichnet.

Trifft er auf eine Variable, dann entnimmt er den Datentyp.
Mit dem Datentyp schaut er in seinen Datatree und entnimmt die Grösse in Bytes.
Pseudocode:
Delphi-Quellcode:
function SizeOf(arg : string):integer;
begin
   item := LookupTree(arg);
   if item=nil then
      CompilerError;

   if IsVariable(item) then
      result := SizeOf(Item.datatypeName)
   else
      result := Item.Instancesize;
end;
Bei komplexen Datentypen wie Records und Objekten, liefert Instancesize die Summe der Einzelteile.
Bei Unions wird die max. InstanceSize der Einzelteile geliefert.
Andreas
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#8

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 18:37
Jo, shmia, so sehe ich das auch. Und das packed wird wohl vordergründig Speicherplatz sparen, aber gleichzeitig einen erhöhten Verwaltungsaufwand für den Deklarations-Baum bedeuten (=lahmer). Habe noch nie packed gebraucht.

Zitat von tommie-lie:
daß bei Records zusätzlich noch das Alignment vom Compiler beachtet wird.
Ähh, wer so mit englischen Wörtern um sich schmeißt, der soll sie bitte mal erklären. Allerdings nicht mit neuen Pseudo-Fachbegriffen. Compiler-Alignment.
Gruß
Hansa
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#9

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 19:04
Zitat von Hansa:
Und das packed wird wohl [...] gleichzeitig einen erhöhten Verwaltungsaufwand für den Deklarations-Baum bedeuten.
Für den Deklarationsbaum selbst wird es wohl keinen Unterschied machen, ich denke mal der Compiler bastelt sich erst seine Typen und Strukturen zusammen. Aber zur Laufzeit ist es ein erhöhter Aufwand beim Zugriff auf einzelne Elemente, weil eben das Alignment fhelt und die richtigen Bits aus dem Speicher gepult und zusammengesetzt werden müssen.

Zitat von Hansa:
Habe noch nie packed gebraucht.
Dann hast du wohl noch nie von C oder anderen Sprachen auf Records in Delphi-Code zugegriffen, dort braucht man es nämlich zum Beispiel. Daher sollten auch alle Records, die man an API-Funktionen schickt, auch als packed deklariert sein, wenn man sich die API-Funktionen selbst importiert.

Zitat von Hansa:
Ähh, wer so mit englischen Wörtern um sich schmeißt, der soll sie bitte mal erklären. Allerdings nicht mit neuen Pseudo-Fachbegriffen.
Das ist kein Pseudo-Fachbegriff, sondern ein Defakto-Fachbegriff. Eine Suche in deiner Online-Hilfe (mindestens bei Delphi <= 7, die von Delphi2005 kenne ich nicht, habe aber nur schlechtes über sie gehört ) hätte dir verraten, was Alignment ist, ebenso wie ein Blick in die Kontexthilfe des Projekteigenschaften-Dialogs, wo du das Alignment einstellen kannst.
Und weil ich jetzt zu faul bin, extra Windows zu booten nur um dir etwas aus der Windows-Hilfe abzutippen, überlasse ich dem werten Leser diese Aufgabe als kleine Übung.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Wie funktioniert SizeOf() intern?

  Alt 14. Sep 2005, 19:55
Beim Packed Record wird der Record, sofern möglich gepackt. Im Gegensatz zu ANSI bzw. UCSD-Pascal aber nur auf Byte-Ebene.
Delphi-Quellcode:
Type
  TNibble = 0..15;
  T1 = Record
    a, c : TNibble;
    b : Integer;
    End;
  T2 = Packed Record
    a, c : TNibble;
    b : Integer;
    End;
SizeOf (T2) liefert Delphi 6, bei UCSD-Pascall jedoch 3 (0,5 bytes für a und c und 2 bytes für b, integer ist/war 16 bit). Auf diese Weise hat man früher Bitsets und Statusbytes implementiert. Es war nicht definiert, das eine Menge als Bitset implementiert ist, aber die Packed Records wurden von N.Wirth eindeutig definiert. Aus Gründen der Performance ist man dann davon abgekommen, was eigentlich Schade ist.

Beim SizeOf (TSomeRecord) werden nicht die Größen der einzelnen Record-Elemente addiert, sondern wirklich die Größe des Records, die dieser im Speicher verbraucht, angegeben. So, wie es sein soll. Der Compiler erzeugt beim Parsen der Typdefinition die Offsets der Record-Elemente. Die Recordgröße ergibt sich dann zwangsläufig aus dem höchsten Offset + SizeOf (ThisElement), Auf 1 bzw. 4 Bytes aufgerunden, je nach "Packed" und Compiler-Einstellungen.

Auch wird kein "DataTree" zum Ermitteln der Speichergröße verwendet, sondern eine simple Lookupliste. Dort stehen einfach die Variablen und deren Datentyp drin. Der Compiler muss ja wissen, ob eine Variable deklariert ist, und welcher Datentyp das ist. Im Prinzip stimmt das aber Alles, was dazu erwähnt wurde...

Das ist nur als Anmerkung zu Tommie-Lie's Post gedacht...
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:58 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