2013-02-23 33 views
10

इस चर घोषणा पर विचार करें:यूनियन कानूनी के माध्यम से __m128 वैरिएबल के बाइट्स तक पहुंच रहा है?

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

मेरा विचार, x, y, z क्षेत्रों के माध्यम से मूल्य निर्दिष्ट SSE2 संगणना प्रदर्शन और x, y, z के माध्यम से परिणाम को पढ़ने के लिए है। मुझे थोड़ा सा संदेह है कि यह कानूनी है या नहीं। मेरी चिंता संरेखण है: एमएसडीएन का कहना है कि __m128 चर स्वचालित रूप से 16 बाइट सीमा से गठबंधन होते हैं, और मुझे आश्चर्य है कि मेरा संघ इस व्यवहार को तोड़ सकता है या नहीं। क्या यहां पर विचार करने के लिए कोई अन्य समस्या है?

+0

नहीं, संरेखण कोई मुद्दा नहीं है। संघ के सभी सदस्यों के लिए सही तरीके से काम करने के लिए जो भी संरेखण आवश्यक होगा। –

+2

यह भी ध्यान दें कि, कम से कम विजुअल स्टूडियो पर, आप 's__.1212_f32 [0]', 'sse.m128_f32 [1]', 'sse.m128_f32 [2]', 'sse.m128_f32 [2]' के साथ '__m128 sse; के घटक प्राप्त कर सकते हैं। 'sse.m128_f32 [3] ', इसलिए इस चाल की कोई आवश्यकता नहीं है। –

+0

@ आर। मार्टिनिन्हो फर्नांडीस और जीसीसी के लिए? –

उत्तर

6

यूनियन का संरेखण ठीक होना चाहिए, लेकिन विंडोज के मामले में आप सीधे 32 बिट घटकों तक पहुंच सकते हैं। 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; 

जैसा कि आप देख सकते हैं, वहाँ वहाँ में 4 तैरता है। यदि आप उबेर परावर्तक बनना चाहते हैं, तो आप शायद सभी समान संरेखण विशेषताओं को परिभाषित कर सकते हैं और ऐसा सुनिश्चित करने के लिए कि कुछ भी तोड़ नहीं जाएगा। जहां तक ​​मैं देख सकता हूं, और यह भी दिया है कि आपने अपने उत्तर में एमएसडीएन का उल्लेख किया है, तो आपको जाना अच्छा होगा। संघ और दोनों इसे सीधे एक्सेस करना चाहिए यदि आपको पता है कि आपके पास एसएसई संगत सामान है। आप डायरेक्टएक्समैथ हेडर के चारों ओर पोक कर सकते हैं और यह भी महसूस कर सकते हैं कि विंडोज कैसे परिभाषाएं और झगड़ा करता है: वे कुछ मैक्रोज़ को भी परिभाषित करते हैं, इस पर निर्भर करता है कि संकलन-समय पर कौन से इंस्टीटिनिक्स और क्षमताओं मौजूद हैं।

संपादित करें: जैसा कि आर। मार्टिन्हो फर्नांडीस टिप्पणियों में कहता है, इसे सीधे एक्सेस करना एक संघ में इसे फिर से परिभाषित करने से सिरदर्द से कम है।

+1

मैं कोड की अपनी बिट्स को क्रॉस-प्लेट से रखना चाहता था, इसलिए यूनियन चाल। –

+0

@ व्हायोलेट जिराफ फिर यूनियन ठीक होना चाहिए। जीसीसी को भी यूनियन का सम्मान करना चाहिए और कुछ भी मज़ेदार नहीं करना चाहिए, लेकिन मैं जीसीसी विशेषज्ञ नहीं हूं और मुझे यकीन है कि कुछ मानदंड वकील साथ आएंगे और हमें 'संघ' का उपयोग करने के लिए दोनों गहरे हेलों की निंदा करेंगे। –