2013-02-23 2 views
10

Рассмотрим эту переменную декларацию:Является ли доступ к байтам переменной __m128 через union legal?

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 вы можете получить компоненты '__m128 sse;' с 'sse.m128_f32 [0]', 'sse.m128_f32 [1]', 'sse.m128_f32 [2]', '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 поплавки там. Если вы хотите быть uber paranoid, вы, вероятно, можете определить все те же самые особенности выравнивания и такие, чтобы убедиться, что ничто не сломается. Однако, насколько я могу судить, и учитывая, что вы упомянули MSDN в своем ответе, вам должно быть все хорошо. И объединение, и доступ к нему напрямую должны работать, если вы знаете, что у вас SSE-совместимый материал. Вы также можете сослаться на заголовки DirectXMath, чтобы понять, как Windows выполняет определения и пререкания: они также определяют несколько макросов, в зависимости от того, какие объекты и возможности присутствуют во время компиляции.

РЕДАКТИРОВАТЬ: Как отмечает Р.МартиньоФернандес в комментариях, доступ к нему напрямую, скорее всего, является скорее головной болью, чем переопределением ее в союзе.

+1

Я хотел, чтобы мои биты кода пересекались, поэтому союзный трюк. –

+0

@ Violet Giraffe Тогда союз должен быть в порядке. GCC должен уважать профсоюз, а также не делать ничего напуганного, но я не эксперт GCC, и я уверен, что какой-нибудь Стандартный юрист придет и осудит нас обоих за самый глубокий из адов за использование 'union'. – 2013-02-23 20:42:56

Смежные вопросы