Speicher belegung und lücken

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
mabelle
Beiträge: 2
Registriert: Di Okt 12, 2021 11:18 am

Speicher belegung und lücken

Beitrag von mabelle » Sa Feb 05, 2022 9:11 pm

Hallo zusammen,
ich habe ein paar Verständnisfragen, undzwar werden die Variablen in der Reihenfolge der Definition im Hauptspeicher abgelegt? Liegen die Variablen direkt hintereinander oder gibt es Lücken? Falls es Lücken gibt, wo liegen sie? Wie viel Speicher belegen die Variablen insgesamt, also inklusive eventueller Lücken? Wie berechne ich diese Lücken? Ich weiß, dass Lücken entstehen können aber wie kann ich sowas ausrechnen und ist es Datenmodell abhängig? "ILP32", "LP64", "LLP64"

Aufgabe1 git:master ❯ ./aufgabe1 | sort -r
Es handelt sich um ein LP64-Datenmodell
Adresse Groese Typ Name Wert
0x7ffc22609a14 4 Int i -33
0x7ffc22609a08 8 Long Int li -5
0x7ffc22609a00 8 Long Long Int lli -11
0x7ffc226099fc 4 Unsigned Int ui 14
0x7ffc226099f0 8 Unsigned Long Int uli 77
0x7ffc226099e8 8 Unsigned Long Long Int ulli 1200
0x7ffc226099e6 2 Short sh 1
0x7ffc226099e4 2 Unsigned Short us 11
0x7ffc226099e0 4 Float f 3.100000
0x7ffc226099d8 8 Double d 3.300000
0x7ffc226099c0 16 Long Double ld 3.330000
0x7ffc226099bf 1 Char c c
0x7ffc226099be 1 Unsigned Char uc a
0x7ffc226099bd 1 Bool b 1
0x5654ae8d3ac0 8 String s Hallo

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Speicher belegung und lücken

Beitrag von Xin » So Feb 06, 2022 9:24 am

mabelle hat geschrieben:
Sa Feb 05, 2022 9:11 pm
Hallo zusammen,
ich habe ein paar Verständnisfragen,
Hallo :-)
mabelle hat geschrieben:
Sa Feb 05, 2022 9:11 pm
undzwar werden die Variablen in der Reihenfolge der Definition im Hauptspeicher abgelegt?
Ja.
mabelle hat geschrieben:
Sa Feb 05, 2022 9:11 pm
Liegen die Variablen direkt hintereinander oder gibt es Lücken? Falls es Lücken gibt, wo liegen sie?
Es darf Lücken geben. Wenn ich beispielsweise eine Struktur so aufbaue:

Code: Alles auswählen

struct testStruct
{
  char letter;      // 1 Byte
  char * pointer;   // 8 Byte
};
kann der Compiler daraus folgendes machen:

Code: Alles auswählen

struct testStruct
{
  char letter;     // 1 Byte
  char padding[7]  // 7 Byte
  char * pointer;  // 8 Byte
};
Damit der Zeiger an einer 8 Byte-Grenze liegt und er schneller die Adresse einlesen kann.
mabelle hat geschrieben:
Sa Feb 05, 2022 9:11 pm
Wie viel Speicher belegen die Variablen insgesamt, also inklusive eventueller Lücken? Wie berechne ich diese Lücken? Ich weiß, dass Lücken entstehen können aber wie kann ich sowas ausrechnen und ist es Datenmodell abhängig? "ILP32", "LP64", "LLP64"
Du kannst mit sizeof( testStruct ) die tatsächliche Größe einer Instanz abfragen.
Allerdings ist mir nicht bekannt, wie man die Nutzdaten errechnen kann, um so die Größe der Lücken zu erhalten.

Du kannst allerdings Compilerabhängig Pragmas benutzen, um dem Compiler für eine Struktur zu verbieten, dort Padding-Bytes einzusetzen. Zum Beispiel, wenn unterschiedliche Computer Binärdaten austauschen müssen. __packed ist so ein Schlüsselwort, wenn ich mich recht entsinne.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

mabelle
Beiträge: 2
Registriert: Di Okt 12, 2021 11:18 am

Re: Speicher belegung und lücken

Beitrag von mabelle » So Feb 06, 2022 7:10 pm

Das bringt mich schon etwas mehr vorran, danke

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Speicher belegung und lücken

Beitrag von cloidnerux » Mo Feb 07, 2022 6:10 pm

Auch noch zum Verständnis:
Variablen sind ja sehr vielseitig was ihre Definition, Typ und Deklaration betrifft. Vorallem für größere Programme ist die Position und größe im Speicher sehr undefiniert, weil es dort durch den Compiler Optimierungen bezüglich Programmgröße, Geschwindigkeit oder anderer Faktoren geben kann.
Wenn du Variablen "Gruppiert" haben möchtest, also einen klar definierten Block an Variablen die auch genau so im Speicher oder Festplatte liegen, musst du diese im Programmcode als Struct oder Klasse(?) definieren und eben mit Schlüsselwörtern wie __packed forcieren. Dies würde mann dann auch als Datenmodell oder ähnlich bezeichnen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten