Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 转换到_m128i时出现奇怪错误_C_Sse_Sse2 - Fatal编程技术网

C 转换到_m128i时出现奇怪错误

C 转换到_m128i时出现奇怪错误,c,sse,sse2,C,Sse,Sse2,我正在尝试将无符号短数组强制转换为\uu m128i: const unsigned short x[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; const unsigned short y[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; __m128i n = *(__m128i*) &y[0]; __m128i m = *(__m128

我正在尝试将无符号短数组强制转换为
\uu m128i

const unsigned short x[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
const unsigned short y[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

__m128i n = *(__m128i*) &y[0];
__m128i m = *(__m128i*) &x[0];
第一个铸造工作很好,但第二个-不是。我有:

Unhandled exception at 0x013839ee in sse2_test.exe: 0xC0000005: Access violation reading location 0xffffffff.

怎么了?有人能帮我吗?

注意数据对齐

当您取消引用
\uuu m128i*
或任何其他SSE类型时,需要将指针对齐到16字节。但是,
x
y
不保证与16字节对齐

强制对齐依赖于编译器

Visual C++

__declspec(align(16)) const unsigned short x[] = ...
GCC

const unsigned short x[] __attribute__((aligned(16))) = ...

或者,您可以使用未对齐的加载(以可能的性能损失为代价):


您不应该盲目地将一个指针类型转换为另一个指针类型,正如Mystical所说,您应该预料到对齐问题。C11有
\u Alignas
,而其他编译器有扩展到C99或C89的功能来完成同样的任务

官方的,也是我发现的最清楚的,用C99实现这一点的方法是创建一个
联合体

union combine {
  unsigned short x[sizeof(__m128i)/sizeof(unsigned short)];
  __m128i y;
}

union combine X = { .x = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} };
这样的
联盟
保证其所有成员都能正确对齐。
现在,您可以轻松地使用
X.y
,甚至不必查看指针引用。

顺便说一句,您是否意识到16
短裤不适合
\uuum128i
?这是gcc人员推荐的标准方式。不幸的是,它往往会产生劣质代码(导致大量寄存器溢出)。顺便说一句,
无符号短x[sizeof(\uu m128i)]
没有任何意义。
sizeof(\uuuu m128i)/sizeof(short)
获取适合
\uuuu m128i
的短裤数量,或者简单地
16
匹配给定的元素数量。@drhirsch,感谢您发现错误,已更正。虽然我有一些严重的疑问,这应该是
16
。这是
16
字节,不是吗?所以初始值设定项(也在问题中)是错误的,不是吗?是的,这就是我的意思。见我对问题的评论。
union combine {
  unsigned short x[sizeof(__m128i)/sizeof(unsigned short)];
  __m128i y;
}

union combine X = { .x = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} };