Seite 1 von 1

Speicher belegung und lücken

Verfasst: Sa Feb 05, 2022 9:11 pm
von mabelle
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

Re: Speicher belegung und lücken

Verfasst: So Feb 06, 2022 9:24 am
von Xin
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.

Re: Speicher belegung und lücken

Verfasst: So Feb 06, 2022 7:10 pm
von mabelle
Das bringt mich schon etwas mehr vorran, danke

Re: Speicher belegung und lücken

Verfasst: Mo Feb 07, 2022 6:10 pm
von cloidnerux
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.