struct align auf nächste 2er Potenz in array



  • Hi,

    habe folgendes Problem:

    Ich habe eine typedef struct xstruct mit einer Größe in Bytes die je nach
    gesetzten #define unterschiedliche Größen annehmen kann.

    Aus dieser Struktur baue ich ein Array:

    xstruct xs_array[100];

    Da ich sehr oft auf dieses Array zugreifen muss, spielt Performance
    eine grosse Rolle. Aus diesem Grund möcht ich die Grösse von xstruct
    auf die nächste 2er Potenz auffüllen wie z.B.:

    echte Grösse aufgefüllte Grösse
    55 -> 64
    59 -> 64
    88 -> 128
    120 -> 128
    176 -> 256
    etc.

    damit bei der Array-Addressierung/Indexierung nur ein shift und kein mul
    gemacht werden muss. Dies soll automatisch zur Compile-Zeit (GNU C++)
    passieren und nicht zur Runtime.

    Gibt es da einen eleganten Trick 😕 ?

    Ich könnte die siezeof(xstruct) 32 x nach rechts shiften und jedesmal
    mit sich selbst ORen und dann eins dazuzählen ... aber das ist hässlich!

    Danke
    Markus



  • Ob es wesentlich Geschwindigkeitsvorteile bringt, die Struktur größer als 8 Byte auszurichten, finde ich zwar fraglich. Aber wenn du unbedingt willst, kannst du sicher mit den Padding-Einstellungen des Compilers spielen.



  • Nun, eine shift kostet normalerweise 1 Takt wohingegen in meinem
    System ein mul mindestens 5 oder mehr Takte benötigt ...

    Sobald xstruct eine 2er-Potenz-Grösse hat braucht der der Array-Index
    halt nur mehr geshiftet werden:

    Beispiel-Schlecht, sizeof(xstruct) = 88
    xstruct myArray[100];
    y = myArray[33]; // Assembler: ArrayElementOffset = 33 * 88;

    Beispiel-Gut, sizeof(xstruct) = 128
    xstruct myArray[100];
    y = myArray[33]; // Assembler: ArrayElementOffset = 33 << 7;

    Letzteres ist deutlich schneller!

    ... aber wie krieg ich zu Compilezeit: sizeof(xstruct) = 2er-Potenz ???



  • m-h-l schrieb:

    ... aber wie krieg ich zu Compilezeit: sizeof(xstruct) = 2er-Potenz ???

    sizeof(xstruct) = ((echteGroesse*2)>>1)



  • ... sorry, das wird nicht klappen, damit kriege ich nur wieder
    die gleiche Grösse da x*2 >> 1 einmal links und dann wieder recht shift,
    das scheint mir ein sinnloses Konstrukt zu sein ...



  • ... ausserdem bezweifle ich das 'sizeof(xstruct)' ein gültiges
    lvalue ist ...


Anmelden zum Antworten