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

时间:2018-07-06 20:06:19

标签: c++ sse simd reinterpret-cast

类似于

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

安全还是不确定?如果未定义,它至少将在所有主要编译器(gcc,clang,msvc,icc)上运行吗?我在我的计算机上使用gcc对其进行了测试,并且可以正常工作,但是我不确定它是否可移植。我知道我可以使用_mm_castps_si128(),但是由于有了模板,第一种方法碰巧会更方便。

2 个答案:

答案 0 :(得分:4)

否,它不是可移植的,并且行为是不确定的; __m128用于float,而__m128i用于整数类型,它们不是兼容类型。

实际上,它甚至没有在MSVC 2017中编译:

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

使用强制类型转换:

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

答案 1 :(得分:0)

整数类型可以reinterpret_cast编辑到指针,引用或它自己的类型。

因此,只有在编译器认为它们是同一类型的情况下,才可以很好地定义两个整数类型之间的转换。