2013-02-23 15 views
10

Xem xét khai báo biến này:Có phải truy cập byte của biến __m128 thông qua nghiệp đoàn hợp pháp không?

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

Ý tưởng của tôi là để gán giá trị thông qua x, y, z lĩnh vực, thực hiện tính toán SSE2 và đọc kết quả thông qua x, y, z. Tôi có chút nghi ngờ về việc liệu nó có hợp pháp hay không. Mối quan tâm của tôi là liên kết: MSDN nói rằng các biến số __m128 được tự động căn chỉnh với ranh giới 16 byte và tôi tự hỏi liệu công đoàn của tôi có thể phá vỡ hành vi này hay không. Có bất kỳ cạm bẫy nào khác để xem xét ở đây không?

+0

Không, căn chỉnh không phải là vấn đề. Công đoàn sẽ có bất kỳ sự liên kết nào là cần thiết để tất cả các thành viên của nó hoạt động chính xác. –

+2

Cũng lưu ý rằng, ít nhất là trên Visual Studio, bạn có thể nhận được các thành phần của '__m128 sse;' với 'sse.m128_f32 [0]', 'sse.m128_f32 [1]', 'sse.m128_f32 [2]', 'sse.m128_f32 [3]', do đó, không cần thiết cho thủ thuật này. –

+0

@ R.MartinhoFernandes và cho gcc? –

Trả lời

6

Căn chỉnh của công đoàn sẽ ổn, nhưng trong trường hợp Windows, bạn có thể truy cập trực tiếp các thành phần 32 bit. Từ 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; 

Như bạn thấy, có 4 nổi trong đó. Nếu bạn muốn trở thành hoang tưởng, bạn có thể xác định tất cả các đặc sản liên kết giống nhau và như vậy để đảm bảo không có gì sẽ phá vỡ. Theo như tôi có thể thấy, tuy nhiên, và cho rằng bạn đã đề cập đến MSDN trong câu trả lời của bạn, bạn nên được tất cả tốt để đi. Cả hai công đoàn và truy cập trực tiếp nên làm việc nếu bạn biết bạn có công cụ tương thích SSE. Bạn có thể poke xung quanh các tiêu đề DirectXMath cũng như để có được một cảm giác về cách Windows hiện các định nghĩa và wrangling chính nó: họ xác định một vài macro cũng tùy thuộc vào instrinsics và khả năng có mặt tại thời gian biên dịch.

EDIT: Như R.MartinhoFernandes nói trong nhận xét, truy cập trực tiếp có lẽ là cách ít đau đầu hơn là xác định lại nó trong một liên minh.

+1

Tôi muốn giữ các bit mã chéo, do đó, lừa công đoàn. –

+0

@VioletGiraffe Sau đó, công đoàn nên được tốt. GCC nên tôn trọng công đoàn và không làm bất cứ điều gì sôi nổi, nhưng tôi không phải là chuyên gia GCC và tôi chắc chắn một số luật sư Standardese sẽ đi cùng và lên án cả hai chúng ta đến sâu nhất của địa ngục để sử dụng 'union'. –