Ich vermute, auf Speicher kann nur in 4er-Schritten zugegriffen werden?

  • C

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Bartosz.

    Ich vermute, auf Speicher kann nur in 4er-Schritten zugegriffen werden?

    Ich habe gerade sizeof(person1) überwacht. Die Anzahl der Bytes sind 16, statt wie gedacht 14. Ich habe zuerst 14 erwartet, weil das struct 10 Chars und einen int enthält. Ein int belegt auf meinem System 4 Bytes. Nun gibt sizeof aber 16 zurück.

    Ich habe sowohl auf x86 als auch auf x64 debuggt – selbes Ergebnis.
    Ich habe dem Char-Array 12 zugewiesen, und 9. Selbes Ergebnis.
    Nur, wenn ich 8 zuweise, wird das Ergebnis kleiner.

    Liege ich richtig in der Annahme, dass auf Speicher nur in 4er-Schritten zugegriffen wird?

    C-Quellcode

    1. struct unnamed
    2. {
    3. char name[10];
    4. int age;
    5. } person1 = { '\0' }, person2 = { '\0' };
    6. strcpy(person1.name, "Jens");
    7. person1.age = 30;
    8. void* unused = memcpy(&person2, &person1, sizeof(person1));
    @Bartosz Nicht ganz.
    Innerhalb einer Struktur kann je nach Compiler-Settings auf 1, 2 4, 8, 16 Byte ausrichten, 4 dürfte Default sein.
    Ein Struktur-Element wird dann in sich dicht gepackt, zwei und mehr Elemente werden auf 4, 8, 16 Bytes ausgerichtet.
    Genau wie bei einer (*.bmp)-Bitmap, die eine Stride-Property hat, dass krumme Pixelbreiten "ordentlich" im Speicher abgelegt werden.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das liegt am sogenannten padding, welches dafür existiert um die Subobjekte mit ihrem richtigen Alignment abzugreifen.

    Int hat 4 byte auf deiner Maschine, das heißt das Zugriffe auf alle Member auf 4-Byte gerichtete Addressen stattfindet.
    Da int ja dann nur auf 4x Addressen gefunden werden kann (sollte es nicht explizit um-aligned worden sein), kann auch im Objekt, nach dem char array nicht direkt der int folgen, da die letzten zwei Elemente nach 8 bereits eine 4x Adresse belegen, das heißt es werden zwei padding bytes extra hinzugefügt, die es ermöglichen deinen int auf die nächste 4x Adresse zu bringen.

    Das ist aber eher das Gegenteil von "dicht gepackt" wie RodFromGermany oben angenommen hatte. :)

    Edit: Als Tipp, es wird zwar hier nicht viel ändern, aber in Zukunft versuche doch alle Felder einer Klasse in absteigender Größe zu sortieren, manchmal passen die dann direkt in die padding bytes.
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------