Unter Verwendung einer Union (in einer Struktur gekapselt), um Konvertierungen für Neon-Datentypen zu umgehen

Ich habe meinen ersten Ansatz mit Vektorisierungs-Intrinsics mit SSE gemacht, wo es im Grunde nur einen Datentyp gibt__m128i. Beim Wechsel zu Neon stellte ich fest, dass die Datentypen und Funktionsprototypen sehr viel spezifischer sind, z.uint8x16_t (ein Vektor von 16unsigned char),uint8x8x2_t (2 Vektoren mit 8unsigned char jeder),uint32x4_t (ein Vektor mit 4uint32_t) etc

Zunächst war ich begeistert (es war viel einfacher, die genaue Funktion für den gewünschten Datentyp zu finden), und dann sah ich, was für ein Durcheinander es war, wenn ich die Daten auf unterschiedliche Weise behandeln wollte. @ Verwendspezifische Casting-Operatoren würde mich für immer dauern. Das Problem wird auch angesprochenHie. Ich kam dann auf die Idee einer in eine Struktur gekapselten Union und einiger Casting- und Zuweisungsoperatoren.

struct uint_128bit_t { union {
        uint8x16_t uint8x16;
        uint16x8_t uint16x8;
        uint32x4_t uint32x4;
        uint8x8x2_t uint8x8x2;
        uint8_t uint8_array[16] __attribute__ ((aligned (16) ));
        uint16_t uint16_array[8] __attribute__ ((aligned (16) ));
        uint32_t uint32_array[4] __attribute__ ((aligned (16) ));
    };

    operator uint8x16_t& () {return uint8x16;}
    operator uint16x8_t& () {return uint16x8;}
    operator uint32x4_t& () {return uint32x4;}
    operator uint8x8x2_t& () {return uint8x8x2;}
    uint8x16_t& operator =(const uint8x16_t& in) {uint8x16 = in; return uint8x16;}
    uint8x8x2_t& operator =(const uint8x8x2_t& in) {uint8x8x2 = in; return uint8x8x2;}

};

Dieser Ansatz funktioniert bei mir: Ich kann eine Variable vom Typ @ verwendeuint_128bit_t als Argument und Ausgabe mit verschiedenen Neon-Eigenschaften, z.vshlq_n_u32, vuzp_u8, vget_low_u8 (in diesem Fall nur als Eingabe). Und ich kann es mit mehr Datentypen erweitern, wenn ich brauche. Hinweis: Die Arrays dienen zum einfachen Drucken des Inhalts einer Variablen.

Ist dies eine korrekte Vorgehensweise?
Gibt es einen versteckten Fehler?
Habe ich das Rad neu erfunden?
(Ist das ausgerichtete Attribut erforderlich?)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage