在simd教程中,我找到了以下代码段。
void simd(float* a,int N)
{
// We assume N % 4 == 0.
int nb_iters = N / 4;
__m128* ptr = reinterpret_cast<__m128*>(a); // (*)
for (int i = 0; i < nb_iters; ++i,++ptr,a += 4)
_mm_store_ps(a,_mm_sqrt_ps(*ptr));
}
现在我的问题是,(*)行为不确定的行吗?由于来自({https://en.cppreference.com/w/cpp/language/reinterpret_cast)
的以下规范每当尝试通过AliasedType类型的glvalue读取或修改DynamicType类型的对象的存储值时,除非满足以下条件之一,否则行为是不确定的:
- AliasedType和DynamicType相似。
- AliasedType是DynamicType的(可能是经过简历验证的)带符号或无符号的变体。
- AliasedType是std :: byte,(从C ++ 17开始)char或unsigned char:这允许将任何对象的对象表示形式检查为字节数组。
在这种情况下,有人如何防止未定义的行为?我知道我可以进行std :: memcopy,但是性能下降会使simd失去作用,或者我错了吗?