2013-02-23 13 views
10

bu değişken beyanı düşünün:Bir __m128 değişkeninin baytına yasal yoldan erişiyor mu?

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

Benim fikrim, x, y, z alanları ile değer atamak SSE2 hesaplamalar yapmak ve x, y, z yoluyla sonucunu okumaktır. Yine de yasal olup olmadığı konusunda küçük şüphelerim var. Benim endişem hizalama: MSDN __m128 değişkenlerin otomatik olarak 16 bayt sınırına hizalandığını söylüyor ve sendika bu davranışı kırabilir eğer merak ediyorum. Burada dikkate alınması gereken başka tuzaklar var mı?

+0

Hayır, hizalama bir sorun değil. Birlik, tüm üyelerinin doğru çalışması için gereken her türlü düzenlemeye sahip olacaktır. –

+2

Ayrıca en azından Visual Studio'da, __m128 sse; 'sse.m128_f32 [0]', 'sse.m128_f32 [1]', 'sse.m128_f32 [2]' bileşenlerini alabileceğinizi de unutmayın. sse.m128_f32 [3] ', bu yüzden bu numaraya gerek yok. –

+0

@ R.MartinhoFernandes ve gcc için? –

cevap

6

Sendikanın hizalaması iyi olmalı, ancak Windows durumunda 32 bit bileşenlere doğrudan erişebilirsiniz. xmmintrin.h (DirectXMath) Gönderen:

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; 

Gördüğünüz gibi, orada 4 yüzer var. Uber paranoyak olmak istiyorsanız, muhtemelen aynı hizalama özelliklerini tanımlayabilirsiniz ve hiçbir şeyin kırılmayacağından emin olabilirsiniz. Gördüğüm kadarıyla, ve, cevabınızda MSDN'den bahsettiğinize göre, gitmek için iyi olmalısınız. SSE uyumlu bir şeyler olduğunu biliyorsanız, hem sendika hem de doğrudan erişilmesi gerekir. Windows'un, tanımları nasıl yaptığı ve kendini nasıl çözdüğü konusunda bir fikir edinebilmek için DirectXMath üstbilgilerinin etrafından dolaşabilirsiniz: derleme zamanında hangi bilgi ve becerilere sahip olduklarına bağlı olarak birkaç makro tanımlayabilirler.

DÜZENLEME: R.MartinhoFernandes'ın yorumlarda söylediği gibi, doğrudan erişim, bir sendikada yeniden tanımlamaktan çok daha az baş ağrısıdır.

+1

Kod parçalarını çapraz-platfrom, dolayısıyla sendika numarasını saklamak istedim. –

+0

@VioletGiraffe O zaman sendika iyi olmalı. GCC sendikaya da saygı göstermeli ve korkak bir şey yapmamalı, ama KİK uzmanı değilim ve eminim ki bazı Avrupalı ​​Avukatlar gelecek ve hem bizi hem de sendikayı kullanmak için en cehenneme mahk condm edecektir. –

İlgili konular