Die Präprozessor-Direktive "#pragma pack( n )" erlaubt es, das Alignmnet von Strukturen zu beeinflussen. Somit lassen sich Strukturen erstellen, deren Felder nicht korrekt ausgerichtet sind. Das "n" steht dabei für das gewünschte Alignment. 

Ein n von 1 erzeugt eine Struktur ohne Padding-Bytes. Alle Felder folgen direkt aufeinander. Bei n > 1 gilt: An stellen wo ein bestimmtes Alignment eingehalten werden muss, werden maximal n -1 Padding-Bytes erzeugt.

Wichtig: Hier am Institut PAES soll aller Code ohne #pragma pack( n ) auskommen! Wenn ihr diese Methode verwendet, dann müsst ihr einen verdammt guten Grund haben!

#include <stdalign.h>
#include <stdio.h>

#pragma pack(1)
struct my_first_type {
    short int x;
    unsigned int y;
};

#pragma pack(1)
struct my_second_type {
    unsigned int y;
    short int x;
};

int main()
{
    struct my_first_type one;
    struct my_second_type two;

    printf("addresses: struct=%p - x=%p, y=%p\n", &one, &one.x, &one.y);
    printf("sizeof(struct my_first_type) : %zd\n", sizeof(struct my_first_type));
    printf("alignof(struct my_first_type): %zd\n", alignof(struct my_first_type));

    printf("addresses: struct=%p - x=%p, y=%p\n", &two, &two.x, &two.y);
    printf("sizeof(struct my_second_type) : %zd\n", sizeof(struct my_second_type));
    printf("alignof(struct my_second_type): %zd\n", alignof(struct my_second_type));

    return 0;
}
Zuletzt geändert: Freitag, 18. Mai 2018, 17:23