在网上的大多数教程或代码片段中,可以看到以下内容:
float *arr= (float*) _aligned_malloc(length * sizeof(float), 16);
__m128 *m1 = (__m128*)arr;
这是否违反了严格的别名规则?我认为确实如此,但是所有那些教程作者肯定不会为了方便而忽略它,因为 __m128 是一个包含 float[4] 的联合,也许我误解了它的一些复杂部分。
在网上的大多数教程或代码片段中,可以看到以下内容:
float *arr= (float*) _aligned_malloc(length * sizeof(float), 16);
__m128 *m1 = (__m128*)arr;
这是否违反了严格的别名规则?我认为确实如此,但是所有那些教程作者肯定不会为了方便而忽略它,因为 __m128 是一个包含 float[4] 的联合,也许我误解了它的一些复杂部分。
这是 GCC 的编译器特定答案
GCC 4.4.3的xmmintrin 标头定义了以下内容:
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
所以,是的,您违反了严格的别名,但是您可以使用该类型这样做。奇怪的是,该__v4sf
类型没有标记为__may_alias__
,因此不能以这种方式使用。