reinterpret_cast<> 在 sse/avx 类型上是安全的还是未定义的?

Is reinterpret_cast<> safe or undefined on sse/avx types?

类似于

__m128 a = something;
__m128i b = reinterpret_cast<__m128i>(a);

安全还是未定义?如果未定义,它是否至少适用于所有主要编译器(gcc、clang、msvc、icc)?我在我的电脑上用 gcc 测试了它,它可以工作,但我不确定它是否便携。我知道可以用_mm_castps_si128(),但是因为模板的缘故,第一种方式恰好更方便

整数类型可以reinterpret_cast-ed 为指针、引用或它自己的类型。

因此,只有当编译器认为它们是同一类型时,两种整数类型之间的转换才是明确定义的。

不,它不可移植且行为未定义; __m128 用于 float__m128i 用于整数类型,这些类型不兼容。

事实上,它甚至不能在 MSVC 2017 中编译:

error C2440: 'reinterpret_cast': cannot convert from '__m128' to '__m128i'

使用内部转换:

__m128 a = something;
__m128i b = _mm_castps_si128(a);