Forum: PC-Programmierung Struktur-Alignment


von Ratloser (Gast)


Lesenswert?

Hallo,
eine Frage an den Experten. Bezieht sich der folgende Ausdruck nur auf 
den Start der Struktur oder auf jeden Member?

typedef struct attribute((aligned))

Internet:
struct S { short f[3]; } attribute ((aligned (8)));

"force the compiler to insure (as far as it can) that each variable
whose type is struct S will be allocated and aligned at least on a
8-byte boundary."

Aber wie verhält es sich in diesem Fall:
struct S { short f1[3];
           short f2[3];} attribute ((aligned (8)));

Wo kommt f2 zu liegen? Wird innerhalb der Struktur auf das alignment 
aufgefüllt oder nur am Ende?

von Adam P. (adamap)


Lesenswert?

Ratloser schrieb:
> Bezieht sich der folgende Ausdruck nur auf
> den Start der Struktur oder auf jeden Member?
>
> typedef struct attribute((aligned))

Das bezieht sich auf die Struktur, wo diese beginnt.


Ratloser schrieb:
> Wo kommt f2 zu liegen? Wird innerhalb der Struktur auf das alignment
> aufgefüllt oder nur am Ende?

Das hat nichts mit oberem zu tun, das was du hier meinst wäre:
1
struct __attribute__ ((__packed__))

https://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Type-Attributes.html

Bsp.
1
// Hier werden hinter "a" 3-Byte leer gelassen.
2
struct S
3
{
4
   uint8_t a;
5
   uint32_t b;
6
};
7
8
// Hier folgt b direkt hinter a
9
struct S
10
{
11
   uint8_t a;
12
   uint32_t b;
13
} __attribute__ ((__packed__));

: Bearbeitet durch User
von Ratloser (Gast)


Lesenswert?

Perfekt, Danke!

von MaWin (Gast)


Lesenswert?

Adam P. schrieb:
> // Hier werden hinter "a" 3-Byte leer gelassen.
> struct S
> {
>    uint8_t a;
>    uint32_t b;
> };

Sicher?

Ich würde das nur bei
1
struct S
2
{
3
   uint32_t b;
4
   uint8_t a;
5
};
behaupten. ;-)

von mh (Gast)


Lesenswert?

MaWin schrieb:
> Ich würde das nur beistruct S
> {
>    uint32_t b;
>    uint8_t a;
> };
> behaupten. ;-)

Und damit mal wieder falsch liegen. Warum sollten hier hinter a 3 Byte 
"leer gelassen" werden?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.