2

在网上的大多数教程或代码片段中,可以看到以下内容:

float *arr= (float*) _aligned_malloc(length * sizeof(float), 16);
__m128 *m1 = (__m128*)arr;

这是否违反了严格的别名规则?我认为确实如此,但是所有那些教程作者肯定不会为了方便而忽略它,因为 __m128 是一个包含 float[4] 的联合,也许我误解了它的一些复杂部分。

4

2 回答 2

2

这还没有违反它——还没有。但是,通过一个指针写入并通过另一个指针读取将违反严格的别名。

相反,您应该使用以下功能:

于 2011-08-10T02:19:00.257 回答
1

这是 GCC 的编译器特定答案

GCC 4.4.3的xmmintrin 标头定义了以下内容:

typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));

所以,是的,您违反了严格的别名,但是您可以使用该类型这样做。奇怪的是,该__v4sf类型没有标记为__may_alias__,因此不能以这种方式使用。

于 2013-10-28T15:34:54.077 回答