Является ли доступ байтами переменной __m128 через профсоюз?

Рассмотрим это объявление переменной:

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

Моя идея - назначить значение через поля x, y, z, выполнить вычисления SSE2 и прочитать результат через x, y, z. Однако у меня есть небольшие сомнения относительно того, является ли это законным. Моя проблема заключается в выравнивании: MSDN говорит, что переменные __m128 автоматически выравниваются до 16-байтовой границы, и мне интересно, может ли мой союз нарушить это поведение. Есть ли еще какие-нибудь подводные камни, чтобы рассмотреть здесь?

Ответ 1

Правило объединения должно быть прекрасным, но в случае 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 выполняет определения и споры: они также определяют несколько макросов, в зависимости от того, какие объекты и возможности присутствуют во время компиляции.

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