Usar una unión (encapsulada en una estructura) para evitar conversiones para tipos de datos de neón

Hice mi primer acercamiento con intrínsecos de vectorización con SSE, donde básicamente solo hay un tipo de datos__m128i. Al cambiar a Neon, descubrí que los tipos de datos y los prototipos de funciones son mucho más específicos, p.uint8x16_t (un vector de 16unsigned char),uint8x8x2_t (2 vectores con 8unsigned char cada),uint32x4_t (un vector con 4uint32_t) etc.

Primero, estaba entusiasmado (era mucho más fácil encontrar la función exacta que funcionaba con el tipo de datos deseado), luego vi lo desordenado que era cuando quería tratar los datos de diferentes maneras. Utilizandooperadores de fundición específicos me llevaría para siempre El problema también se abordaaquí. Entonces se me ocurrió la idea de una unión encapsulada en una estructura, y algunos operadores de casting y asignación.

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;}

};

Este enfoque funciona para mí: puedo usar una variable de tipouint_128bit_t como argumento y salida con diferentes intrínsecos de neón, p.vshlq_n_u32, vuzp_u8, vget_low_u8 (en este caso solo como entrada). Y puedo ampliarlo con más tipos de datos si lo necesito. Nota: Las matrices son para imprimir fácilmente el contenido de una variable.

¿Es esta una forma correcta de proceder?
¿Hay algún defecto oculto?
¿He reinventado la rueda?
(¿Es necesario el atributo alineado?)

Respuestas a la pregunta(3)

Su respuesta a la pregunta