zu mehrdimensionalen Array von einem anderen Typ I habenmehrdimensionales Array Guss
const uint8_t longByteTable[16][256][16] = { { { 0x00, ... } } };
als dreidimensionale 16x256x16 Array von fest codierten Werte Oktett erklärt.
Iconst uint64_t reinterpretedTable[16][256][2];
Was eine gültige WeiselongByteTable
zu werfen brauchen, ist:
Zur Optimierung und verschiedene andere Gründe, warum ich dieses Array benötigen als dreidimensionale 16x256x2 Array von uint64_t Werte interpretiert werdenreinterpretedTable
innerhalb der strikten ISO/ANSI C. Ist das:
const uint64_t (*reinterpretedTable)[256][2] =
(const uint64_t(*)[256][2])longByteTable;
ein richtiger Weg, das zu tun?
P.S. Ich kann longByteTable
mit letztem Typ nicht erklären, weil es dann nicht richtig mit unterschiedlichem endianess funktionieren würde, und ich entweder verschiedene Tabellen für diffendiannes endianness erklären oder einige Laufzeitkontrollen und Umdrehungen durchführen müsste. Und ja, alle weiteren Transformationen des neuinterpretierten Arrays sind endianitätsinvariant.
"Ich kann' longByteTable' nicht mit letzterem Typ deklarieren, weil es dann nicht mit unterschiedlicher Endianz funktionieren würde. "Das klingt sehr nach einem X/Y-Problem. Wenn Sie "neuinterpretierteTabelle" erstellen müssen, um einen bestimmten Umgang mit der Endianz zu gewährleisten, sollten Sie in der Lage sein, es portabler zu machen - zum Beispiel mit 'hton' /' ntoh' Funktionen. – dasblinkenlight
Nein, ich brauche die Konvertierungen und das Byte nicht. Alle Transformationen sind endianitätsunabhängig, wie Xor's und Zuweisungen. Aber xoring-Werte vom Typ 'uint64_t' sind in meinem Fall viel schneller als das xoring von 4 Wertepaaren vom Typ 'uint8_t', weil es mit einer einzelnen Anweisung anstelle von 4 separaten Anweisungen ausgeführt wird. Ja, manchmal sieht der Compiler dies durch und ersetzt Bytes xor durch Vollregister-XORs, aber nicht die ganze Zeit. – aprelev