C und Speicherbelegung der Typen (in struct)

  • Hallo zusammen!
    Ich hätte hier eine Frage bezüglich der Speicherbelegung in C.
    Normalerweise benötigen die Typen ja folgenden Speicher (Windows und VisualC++):
    - char 1byte
    - int 4byte
    - double 8byte


    Soweit ist's klar, wenn ich nur einen dieser Typen verwende gelten diese Werte.


    Jetzt meine Frage: Wie sieht's aus, wenn ich mir eine neue Struktur definiere?
    Ich hab's vorhin ausprobiert, mit "sizeof" kann ich mir ja den tatsächlich benötigten Speicher anzeigen lassen, z.B. von folgendem:


    struct s_Test
    {
    char Titel[5];
    int Anzahl;
    double Genau;
    };


    Warum belegt der aber 24byte?? Es müssten doch 5+4+8= 17byte sein, oder nicht?


    Bin schonmal gespannt, C ist manchmal schon wirr...


    Grüße,
    Michael

  • Bei mir belegt die Struktur 20 byte, kannst du nochmal schauen, ob das bei dir nicht auch so ist?


    Das struct wird im Hauptspeicher abgelegt. Auf den meisten Systemen wird in 4 Byte Bloecken gespeichert, um den Zugriff zu beschleunigen.


    Das kannst du dir bei deinem struct etwa so vorstellen:

    Code
    Speicherbelegung in 5 Bloecken zu je 4 Byte (wobei x ungenutzt)
    1. 4 Byte Titel[0] Titel[1] Titel[2] Titel[3]
    2. 4 Byte Titel[4] x x x
    3. 4 Byte Anzahl
    4. 4 Byte die ersten 4 Byte von Genau
    5. 4 Byte die zweiten 4 Byte von Genau
    -----------
    20 Byte


    Somit verschwendet das System 3 Byte. Man kann das bei einigen Compilern einstellen, dass das struct nur 17 Byte verwendet, aber wie und bei welchen, da bin ich ueberfragt.
    Allerdings sollte man hierbei beachten, dass das System langsamer auf den Speicher zugreifen kann.
    Also eine Abwaegung zwischen Geschwindigkeit und Speicherverbrauch

    r=3,16 km


    prepaidinfo.de Prepaidtarife, Roamingpreise, Preise und Einstellungen für MMS und WAP, Übernahmeformulare

  • Also ich hab's nochmal getestet, es sind tatsächlich 24 Byte.


    Ich hab auch noch etwas damit rumprobiert, anscheinend beeiflusst der double den int.
    Wenn ich den char[5] weglasse nimmt er 16 Byte (8+8 ?),
    wenn ich den double weglasse 12 Byte und (8+4 ?)
    wenn ich den int weglasse sind's auch 16 Byte (8+8 ?).


    Sobald also der double dazukommt nimmt er für den int nicht 4 sondern 8 Byte.
    Dann nimmt er im obigen Beispiel also 8 für die Charakter, 8 für den int und 8 für den double, oder?


    Als System läuft bei mir WinXP-Home auf nem Centrino und wie gesagt nehm ich als Compiler VisualC++6.


    Danke schonmal für deine Antwort,
    Grüße,
    Michael

  • Zitat


    Wenn ich den char[5] weglasse nimmt er 16 Byte (8+8 ?),
    wenn ich den double weglasse 12 Byte und (8+4 ?)
    wenn ich den int weglasse sind's auch 16 Byte (8+8 ?).


    Bei mir schauts so aus:
    12 Byte (4 Byte int + 8 Byte double)
    12 Byte (5 Byte char + 3 Byte ungenutzt + 4 Byte int)
    16 Byte (5 Byte char + 3 Byte ungenutzt + 8 Byte double)


    Bin auf einer P4-2000 Workstation mit Linux und gcc-Compiler
    Also hier ist ganz klar die 4 Byte-Block Unterteilung.


    Ich vermute einfach mal, das bei dir die Speicherblockgroesse so berechnet wird:
    Der groesste Typ (double 8 Byte) bestimmt die Speicherblockgroesse und somit belegt jeder Typ ein vielfaches dieser 8 Byte, mindestens aber 8 Byte.
    Laesst du den double weg, ist der int der groesste Typ, die Blockgroesse betraegt also 4 Byte.


    Koennte vielleicht am Compiler liegen, bin mir aber echt nicht so sicher!

    r=3,16 km


    prepaidinfo.de Prepaidtarife, Roamingpreise, Preise und Einstellungen für MMS und WAP, Übernahmeformulare

  • Hab's nochmal getestet, ich glaub, du hast Recht!
    Die Blockgröße wird immer durch den größten Datentyp bestimmt.
    Wenn ich einen char[2] und einen double benutze, dann nimmt der struct 16Bytes, also 6 Bytes verschwendet. und wenn ich char[9] und den double verwende, dann belegt er 24 Bytes (also 8 für double, 9 für char und 7 verschwendet).
    Ein int mit einem char[9] belegt 16 Byte, also 4 für int und 3mal4 Byte für den char.
    Ein double mit dem char[9] belegt 24 Byte, also 8 für den double und 2mal8 für den char.


    Ich geh mal davon aus, dass es compilerabhängig ist, werd's aber später (in den Semesterferien :D ) mal mal mit dem gcc versuchen.


    Vielen Dank nochmals, hast mir echt geholfen :top:


    Viele Grüße,
    Michael

  • Hi,
    der Platz, der "die kleinste Einheit" ist wird durch die Wortbreite des Systems festgelegt.
    Das ist heutzutage meistens 32bit, also 4byte.


    Der Grund ist, dass Prozessoren (normalerweise) nur auf komplette Worte zugreifen koennen und da sollten natuerlich die Variablen immer genau eingepasst werden und sie werden deswegen dementsprechend ausgerichtet (alignment).
    Bei einzelnen Variablen merkst du davon gar nichts mit sizeof, bei Strukturen aendert sich natuerlich die Groesse.


    cu
    XlF

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!