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);
类似于
__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);