2013-02-23 5 views
10

이 변수 선언을 고려노동 조합을 통해 __m128 변수의 바이트에 액세스 할 수 있습니까?

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

내 생각은, x, y, z 필드를 통해 값을 지정 SSE2 연산을 수행하고 x, y, z을 통해 결과를 읽는 것입니다. 나는 그것이 합법적인지에 관해서는 약간의 의문을 가지고있다. 내 관심사는 정렬이다 : MSDN은 __m128 변수가 자동으로 16 바이트 경계에 정렬되며 내 연합이이 동작을 중단시킬 수 있는지 궁금해한다. 여기에서 고려해야 할 다른 함정이 있습니까?

+0

아니요, 정렬은 문제가되지 않습니다. 노동 조합은 모든 회원국이 올바르게 일하기 위해 필요한 정렬을 갖습니다. –

+2

적어도 Visual Studio에서는'sse.m128_f32 [0]','sse.m128_f32 [1]','sse.m128_f32 [2]','sse.m128_f32 [2]'를 사용하여'__m128 sse;'의 구성 요소를 얻을 수 있습니다. 'sse.m128_f32 [3]'이므로이 트릭이 필요 없습니다. –

+0

@ R.MartinhoFernandes 및 gcc 용? –

답변

6

노동 조합의 정렬은 괜찮지 만 Windows의 경우 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 수레가있다. 편집증에 동조하기를 원한다면, 아마 같은 정렬 맞춤법 등을 정의하여 아무 것도 깨지지 않도록 할 수 있습니다. 지금까지 내가 볼 수있는 한, 당신이 대답에 MSDN을 언급했다면, 당신은 모두 잘해야합니다. 당신이 SSE와 호환되는 것들을 알고 있다면 노동 조합과 그것을 직접 액세스하는 것이 효과가있다. DirectXMath 헤더를 중심으로 Windows가 어떻게 정의하고 논쟁하는지에 대한 느낌을 얻을 수 있습니다. 즉, 컴파일 타임에 어떤 intrinsics와 기능이 있는지에 따라 몇 가지 매크로를 정의 할 수 있습니다.

편집 : R.MartinhoFernandes가 의견에서 말했듯이, 직접 액세스하는 것은 노조에서 재정의하는 것보다 덜 골치 거리가 될 것입니다.

+1

나는 코드를 십자가 형태로 유지하고 싶다. 따라서 노동 조합의 트릭이다. –

+0

@VioletGiraffe 그러면 조합은 잘되어야합니다. GCC도 노조를 존중해야하며 펑키하지는 마라. 나는 GCC 전문가가 아니며 일부 표준 변호사가 우리를 노조 사용에 대한 가장 깊은 곳으로 데려다 줄 것이라고 확신한다. –

관련 문제