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
Speicher belegung und lücken
- Xin
- nur zu Besuch hier
- Beiträge: 8862
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Speicher belegung und lücken
Hallo
Ja.
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
};
Code: Alles auswählen
struct testStruct
{
char letter; // 1 Byte
char padding[7] // 7 Byte
char * pointer; // 8 Byte
};
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.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Speicher belegung und lücken
Das bringt mich schon etwas mehr vorran, danke
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Speicher belegung und lücken
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.
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
quod erat expectandum