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

Bad*_*r99 5 c++ sse simd reinterpret-cast

是不是像

__m128 a = something;
__m128i b = reinterpret_cast<__m128i>(a);
Run Code Online (Sandbox Code Playgroud)

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

rus*_*tyx 4

不,它不可移植并且行为未定义;__m128float和is用于__m128i整数类型,这些不是兼容的类型。

事实上,它甚至无法在 MSVC 2017 中编译:

error C2440: 'reinterpret_cast': cannot convert from '__m128' to '__m128i'
Run Code Online (Sandbox Code Playgroud)

使用强制转换内在函数:

__m128 a = something;
__m128i b = _mm_castps_si128(a);
Run Code Online (Sandbox Code Playgroud)