Рассмотрим эту переменную декларацию:Является ли доступ к байтам переменной __m128 через union legal?
union {
struct {
float x, y, z, padding;
} components;
__m128 sse;
} _data;
Моя идея заключается в том, чтобы присвоить значение через x
, y
, z
полей, выполнять SSE2 вычисления и прочитать результат через x
, y
, z
. Однако у меня есть небольшие сомнения относительно того, является ли это законным. Моя проблема заключается в выравнивании: MSDN говорит, что переменные __m128
автоматически выравниваются до 16-байтовой границы, и мне интересно, может ли мой союз нарушить это поведение. Есть ли еще какие-нибудь подводные камни, чтобы рассмотреть здесь?
Нет, выравнивание не является проблемой. Союз будет иметь любое выравнивание, необходимое для правильной работы всех его членов. –
Также обратите внимание, что, по крайней мере, в Visual Studio вы можете получить компоненты '__m128 sse;' с 'sse.m128_f32 [0]', 'sse.m128_f32 [1]', 'sse.m128_f32 [2]', 'sse.m128_f32 [3]', поэтому нет необходимости в этом трюке. –
@ R.MartinhoFernandes и для gcc? –