2013-02-23 11 views
10

considerare questo dichiarazione di variabile:L'accesso ai byte di una variabile __m128 tramite unione legale?

union { 
     struct { 
      float x, y, z, padding; 
     } components; 
     __m128 sse; 
    } _data; 

La mia idea è quella di assegnare il valore attraverso x, y, z campi, eseguire calcoli SSE2 e leggere il risultato attraverso x, y, z. Ho qualche dubbio sul fatto che sia legale, però. La mia preoccupazione è l'allineamento: MSDN dice che le variabili __m128 sono automaticamente allineate al limite di 16 byte e mi chiedo se il mio sindacato possa rompere questo comportamento. Ci sono altre insidie ​​da considerare qui?

+0

No, l'allineamento non è un problema. L'unione avrà tutto l'allineamento necessario per far funzionare correttamente tutti i suoi membri. –

+2

Si noti inoltre che, almeno su Visual Studio, è possibile ottenere i componenti di '__m128 sse;' con 'sse.m128_f32 [0]', 'sse.m128_f32 [1]', 'sse.m128_f32 [2]', 'sse.m128_f32 [3]', quindi non c'è bisogno di questo trucco. –

+0

@ R.MartinhoFernandes e per gcc? –

risposta

6

L'allineamento dell'unione dovrebbe essere corretto, ma nel caso di Windows è possibile accedere direttamente ai componenti a 32 bit. Da xmmintrin.h (DirectXMath):

typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128 { 
    float    m128_f32[4]; 
    unsigned __int64 m128_u64[2]; 
    __int8    m128_i8[16]; 
    __int16    m128_i16[8]; 
    __int32    m128_i32[4]; 
    __int64    m128_i64[2]; 
    unsigned __int8  m128_u8[16]; 
    unsigned __int16 m128_u16[8]; 
    unsigned __int32 m128_u32[4]; 
} __m128; 

Come si può vedere, ci sono 4 carri in là. Se vuoi essere un uber paranoico, puoi probabilmente definire tutte le stesse specialità di allineamento e tale da assicurarti che nulla possa rompersi. Per quanto posso vedere, tuttavia, e dato che hai menzionato MSDN nella tua risposta, dovresti essere tutto a posto. Sia l'unione che l'accesso diretto dovrebbero funzionare se sai di avere materiale compatibile con SSE. Puoi anche dare un'occhiata alle intestazioni di DirectXMath per avere un'idea di come Windows fa le definizioni e le discussioni stesse: definiscono anche alcuni macro, a seconda di quale instrinsics e funzionalità sono presenti in fase di compilazione.

EDIT: Come dice R.MartinhoFernandes nei commenti, accedervi direttamente è probabilmente un modo molto meno mal di testa che ridefinirlo in un sindacato.

+1

Volevo mantenere i miei bit di codice in modo incrociato, quindi il trucco del sindacato. –

+0

@VioletGiraffe Quindi il sindacato dovrebbe andare bene. Anche il GCC dovrebbe rispettare il sindacato e non fare nulla di strano, ma io non sono un esperto di GCC e sono certo che un avvocato standardese arriverà e ci condannerà entrambi al più profondo degli inferni per l'uso di "union". –

Problemi correlati