Usando uma união (encapsulada em uma estrutura) para ignorar conversões para tipos de dados neon

Fiz minha primeira abordagem com intrínsecas de vetorização com SSE, onde há basicamente apenas um tipo de dados__m128i. Ao mudar para Neon, achei os tipos de dados e os protótipos de funções muito mais específicos, por exemplo,uint8x16_t (um vetor de 16unsigned char),uint8x8x2_t (2 vetores com 8unsigned char cada),uint32x4_t (um vetor com 4uint32_t) etc.

Primeiro fiquei entusiasmado (muito mais fácil encontrar a função exata operando no tipo de dados desejado), depois vi como era uma bagunça ao querer tratar os dados de maneiras diferentes. Usandooperadores de fundição específicos me levaria para sempre. O problema também é abordadoaqui. Então, tive a ideia de uma união encapsulada em uma estrutura e em alguns operadores de seleção e atribuição.

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

};

Essa abordagem funciona para mim: eu posso usar uma variável do tipouint_128bit_t como argumento e saída com diferentes intrínsecos ao Neon, por ex.vshlq_n_u32, vuzp_u8, vget_low_u8 (neste caso, apenas como entrada). E posso estendê-lo com mais tipos de dados, se necessário. Nota: As matrizes devem imprimir facilmente o conteúdo de uma variável.

Esta é uma maneira correta de proceder?
Existe alguma falha oculta?
Reinventei a roda?
(O atributo alinhado é necessário?)

questionAnswers(3)

yourAnswerToTheQuestion