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 ...