Quote:
|
zum Beispiel, also dürfte der Inhalt des Structs nicht mehr als 16 bytes veranschlagen? So hab ichs zumindest verstanden.)
|
Falsch.
CPUs können Daten verschieden Effizient adressieren. Ein Index 8 oder 16 kann schneller geladen werden als ein Index 3 oder 11, weshalb mit der alignas() Instruktion ein Padding geschaffen wird.
Hat man jetzt z.B. in deinem Beispiel noch einen int i (size=4), einen char c (size=1) und einen short s (size=2), so wird i direkt nach sse_data sein, c wird nach einem Padding von 12 Byte folgen und s nach einem Padding von 15 Byte. Ein weiterer Member hätte einen Abstand von 14 Byte zu s.
Beim Reverse Engineering ist das relativ relevant, da die struct-Member bei nachgebauten structs exakt an der selben Stelle im Speicher liegen sollen.
Code:
struct alignas(16) sse_t
{
float sse_data[4];
int i;
char c;
short s;
};
würde nachgebaut so aussehen:
Code:
struct alignas(1) sse_t
{
float sse_data[4]; // 16 byte
int i; // 4 byte
char padding_1[12]; // 12 byte padding
char c; // 1 byte
char padding_2[15]; // 15 byte padding
short s; // 2 byte
// nicht sicher, ob das ebenfalls implementiert wird:
char padding_3[14]; // 14 byte padding
};
sizeof(sse_t) wäre dann 60, obwohl nur 23 byte für die Member belegt werden.