Einzelnen Beitrag anzeigen

Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Kurze Sicht in die Blackbox BDS - oder "Was geht ab

  Alt 13. Jan 2009, 19:08
Zitat von heri:
Für Dynamische Variablen (Objekte, Strings, Arrays) muss noch außerhalb des Stacks (also auf dem Heap) Speicher reserviert werden. Das geschieht je nach Größe der Variablen und frei zur Laufzeit (deswegen ja dynamisch).

wenn ich folgendes programmiere:
Delphi-Quellcode:
var
i: Integer;
j: Int64;
c: Char;
s: String[10];
x: String;
begin
  i := 1;
  j := 2;
  c := '1';
  s := '0123456789';
  x := '01234567890123456789';
end;
wieviel Platz wird dann wann im Arbeitsspeicher reserviert?
Wir müssen unterscheiden: Stack und Heap.
Auf dem Heap muss man Speicher vor dem Gebrauch reservieren. Das geschieht bei
  • Objekten durch TKlasse.Create
  • durch new oder getmem
  • bei Strings implizit durch Zuweisung
  • bei Strings und dyn. Arrays explizit durch "Setlength"
  • (und eigentlich auch durch localalloc, globalalloc, oder virtualalloc) Aber den Punkt vergessen wir besser erstmal. Den brauch man in einer normalen Anwendung nicht
Auf dem Stack muss man nichts reservieren. Der Stack wird am Anfang (eines Threads) angelegt und ist je nach Einstellung so 100kB groß (siehe Objektoptionen) Und da kommen i.A. lokale Variablen, Übergabeparamter und Rücksprungadressen drauf.
Schau dazu mal in diese Präsentation: http://www.delphipraxis.net/internal...t.php?t=104196

Was macht deine Funktion? Sie schnappt sich auf dem Stack einfach 4 (Integer) + 8 (Int64) + 4 (Char; weniger als 4 geht nicht) + 12 (11 für shortstring mit Längenangabe und 1 für Alignment auf 4) + 4 (dynamischer String = Pointer) = 28 Bytes Und kann dort problemlos alle Werte reinschreiben. Außer beim dynamsichen String, da müsste die Funktion Speicher vom Heap reservieren (was die Länge + 1 Nullbyte + 8 "stringHeader" sind). Hier würde aber nur der 4 Byte große Pointer auf dem Stack zu dem Konstentenstring umgebogen, der im Image der Exe im speicher rumliegt. Das hängt mit Referenzzählung etc. zusammen. Du siehst, es ist alles komplizierter als so ein kurzer Beitrag erklären kann. Bücher kenne ich darüber nicht.

Zitat von heri:
auf einem SQL Server habe ich ein Feld varchar(255) mit dem Wert '0123456789' - wieviel Speicherplatz geht denn - bezogen auf dieses Feld - "verloren"
es sollten eigentlich ja 10 Byte sein - oder?
Hmm, eigentlich nur eine Frage pro Thread. Sonst sihet man hier nicht mehr durch. Das oben ist ja vielleicht noch ok (muss zum Glück ein Mod entscheiden, nicht ich). Aber jetzt schweifst du komplett zu Datenbanken ab. Frag doch einfach mal in einem neuen Thread (ich würde übrigens sagen 10Byte - wegen varchar.



Zitat von heri:
welche DLL des OS ist denn hauptsächlich für das Erstellen der Form zuständig?
Zitat von mkinzler:
Keines, das macht die VCL
ähm, aber reicht die VCL die Messages nicht ans OS und das OS zeichnet dann die Forms?
Für mich ist die VCL eh nur eine "Zwischenschicht" zwischen Applikation und dem OS?
Ja @heri, die VCL ist zum einen "nur" eine Kapselung der WinAPI zum anderen aber auch mit nützlichen Erweiterung. Bei einer Form oder einem Button (also diese Standard-Kompos) trifft "einfach" in etwa zu. Die DLL von Windows ist dann die user32.dll (oder user32.lib) Hilft dir aber bei der Anwendung von Delphi nicht wirklich weiter. Da ist die VCL für dich der Ansprechpartner. (was wahrscheinlich mkinzler in seiner üblichen kurzen Form ausdrücken wollte).
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat