alignas keyword usage

10/20/2014 16:13 Hiris#1
Hoi, ich bin letztens über alignas gestolpert und hab das Beispiel dafür nicht direkt verstanden darum gleich mal etwas recherchiert und durch
[Only registered and activated users can see links. Click Here To Register...]
auch eigentlich so halbwegs verstanden was da passiert ( 16 byte grenze bei #
struct alignas(16) sse_t
{
float sse_data[4];
};

zum Beispiel, also dürfte der Inhalt des Structs nicht mehr als 16 bytes veranschlagen? So hab ichs zumindest verstanden.)

Meine Frage wäre jetzt vor allem, wann es sinnvoll ist sowas einzusetzen, evtl. ein kleines Beispiel :)
10/20/2014 16:38 snow#2
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.
10/20/2014 16:46 Dr. Coxxy#3
Quote:
Originally Posted by snow View Post
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.
was verbrichst du denn da für nen schwachsinn?
die objektinstanzen der strukt werden auf 16byte boundaries aligned, die einzelnen member werden nicht aligned.