在C++中调用sse2函数问题

tgh621 2008-07-08 10:21:02

#include "stdafx.h"
#include <xmmintrin.h>
#include <emmintrin.h>
int _tmain(int argc, _TCHAR* argv[])
{
int a[8];
__m128i *p;
p=(__m128i *)a;
*p=_mm_setzero_si128();

return 0;
}

在VS2003中调试,为什么在debug模式下就会报内存读写异常,而在release下就不会报错了
...全文
233 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tgh621 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yyyapple 的回复:]
检查下_mm_setzero_si128(); 函数
看看 a大小多少
[/Quote]
_mm_setzero_si128(); 是库函数返回128位0
tgh621 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yyyapple 的回复:]
引用 6 楼 tgh621 的回复:
引用 5 楼 yyyapple 的回复:
系统本来给你32字节,你对36字节进行了改动,其不乱套了

没听明白你的话

额,

*p=_mm_setzero_si128();
这个bitwise拷贝,
有可能把int a[8];分配的32字节外的内容覆盖,在debug模式下系统发现这个问题,提醒了有危险,不行

在relase模式下,代码经过优化简化,不会提示你这个信息,在乐观的情况下,不会有问题,如果覆盖了栈中比较重要的东西比如…
[/Quote]
但是int a[8];一共有8*32=256位了,而*p=_mm_setzero_si128();只会初始话前面128位呀,怎末可能越界呢,我想不明白
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
检查下_mm_setzero_si128(); 函数
看看 a大小多少
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tgh621 的回复:]
引用 5 楼 yyyapple 的回复:
系统本来给你32字节,你对36字节进行了改动,其不乱套了

没听明白你的话
[/Quote]
额,

*p=_mm_setzero_si128();
这个bitwise拷贝,
有可能把int a[8];分配的32字节外的内容覆盖,在debug模式下系统发现这个问题,提醒了有危险,不行

在relase模式下,代码经过优化简化,不会提示你这个信息,在乐观的情况下,不会有问题,如果覆盖了栈中比较重要的东西比如返回地址那程序就down了
tgh621 2008-07-08
  • 打赏
  • 举报
回复
__m128i是占128位的数据类型
hai040 2008-07-08
  • 打赏
  • 举报
回复
__m128i是什么类型?
[Quote=引用 1 楼 yyyapple 的回复:]
估计越界了
[/Quote]
tgh621 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yyyapple 的回复:]
系统本来给你32字节,你对36字节进行了改动,其不乱套了
[/Quote]
没听明白你的话
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
系统本来给你32字节,你对36字节进行了改动,其不乱套了
tgh621 2008-07-08
  • 打赏
  • 举报
回复
应该是越界了,我把a[8];改为a[17]就不报错了,为什么呢。
tgh621 2008-07-08
  • 打赏
  • 举报
回复
为什么会越界呢
languagec 2008-07-08
  • 打赏
  • 举报
回复
一阵子没上CSDN,都看不懂题目了
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
估计越界了
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mLee79 的回复:]
不是说了么, release 模式正常是走狗屎运了, 完全是一种巧合 ...
正确的写法是 __declspec( align(16) ) int a[6];
[/Quote]

学习了
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 yyyapple 的回复:]
引用 16 楼 mLee79 的回复:
_mm_setzero_si128 的操作数要对齐在16字节边界上,否则GP(C0...05) ... 如果没有报错就是走狗屎运了,a刚好在16字节边界 ...


可release模式下很正常,真不懂ms怎么设计的
[/Quote]

恩,又看了一遍,如果不偏移不16字节对齐的话,relase模式下也不正常,shit

看来要debug必须强制它16字节对齐
mLee79 2008-07-08
  • 打赏
  • 举报
回复
不是说了么, release 模式正常是走狗屎运了, 完全是一种巧合 ...
正确的写法是 __declspec( align(16) ) int a[6];
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 mLee79 的回复:]
_mm_setzero_si128 的操作数要对齐在16字节边界上,否则GP(C0...05) ... 如果没有报错就是走狗屎运了,a刚好在16字节边界 ...
[/Quote]

可release模式下很正常,真不懂ms怎么设计的
mLee79 2008-07-08
  • 打赏
  • 举报
回复
_mm_setzero_si128 的操作数要对齐在16字节边界上,否则GP(C0...05) ... 如果没有报错就是走狗屎运了,a刚好在16字节边界 ...
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
也就是说采用6个数组两者模式都正常:

#include "stdafx.h"
#include <xmmintrin.h>
#include <emmintrin.h>
int _tmain(int argc, _TCHAR* argv[])
{
int a[6];
__m128i *p;
p=(__m128i *)a;
*p=_mm_setzero_si128();

return 0;
}
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
我想是不是一个bug呢?
yyyapple 2008-07-08
  • 打赏
  • 举报
回复
#数组个数为8,debug模式下的反汇编:

00413520 push ebx
00413521 mov ebx,esp
00413523 sub esp,8
00413526 and esp,0FFFFFFF0h
00413529 add esp,4
0041352C push ebp
0041352D mov ebp,dword ptr [ebx+4]
00413530 mov dword ptr [esp+4],ebp
00413534 mov ebp,esp
00413536 sub esp,118h
0041353C push esi
0041353D push edi
0041353E lea edi,[ebp-118h]
00413544 mov ecx,46h
00413549 mov eax,0CCCCCCCCh
0041354E rep stos dword ptr es:[edi]
00413550 mov eax,dword ptr [___security_cookie (417004h)]
00413555 xor eax,ebp
00413557 mov dword ptr [ebp-4],eax
int a[8];
__m128i *p = NULL;
0041355A mov dword ptr [ebp-34h],0
p=(__m128i *)a;
00413561 lea eax,[ebp-28h] #数组的首地址,28h = 40不是16的倍数,奇怪通不过
00413564 mov dword ptr [ebp-34h],eax
*p =_mm_setzero_si128();
00413567 pxor xmm0,xmm0
0041356B movdqa xmmword ptr [ebp-110h],xmm0
00413573 mov eax,dword ptr [ebp-34h]
00413576 movdqa xmm0,xmmword ptr [ebp-110h]
0041357E movdqa xmmword ptr [eax],xmm0

#数组个数为6,debug模式下反汇编:

00413520 push ebx
00413521 mov ebx,esp
00413523 sub esp,8
00413526 and esp,0FFFFFFF0h
00413529 add esp,4
0041352C push ebp
0041352D mov ebp,dword ptr [ebx+4]
00413530 mov dword ptr [esp+4],ebp
00413534 mov ebp,esp
00413536 sub esp,118h
0041353C push esi
0041353D push edi
0041353E lea edi,[ebp-118h]
00413544 mov ecx,46h
00413549 mov eax,0CCCCCCCCh
0041354E rep stos dword ptr es:[edi]
00413550 mov eax,dword ptr [___security_cookie (417004h)]
00413555 xor eax,ebp
00413557 mov dword ptr [ebp-4],eax
int a[6];
__m128i *p = NULL;
0041355A mov dword ptr [ebp-2Ch],0
p=(__m128i *)a;
00413561 lea eax,[ebp-20h] #数组的首地址,20h = 32 16的倍数,奇怪通过了
00413564 mov dword ptr [ebp-2Ch],eax
*p =_mm_setzero_si128();
00413567 pxor xmm0,xmm0
0041356B movdqa xmmword ptr [ebp-110h],xmm0
00413573 mov eax,dword ptr [ebp-2Ch]
00413576 movdqa xmm0,xmmword ptr [ebp-110h]
0041357E movdqa xmmword ptr [eax],xmm0

#realse 模式下,4个数组元素,优化简化了,一次通过!!!!!
00401000 push ebp
00401001 mov ebp,esp
00401003 and esp,0FFFFFFF0h
00401006 sub esp,10h
int a[4];
__m128i *p = NULL;
p=(__m128i *)a;
*p =_mm_setzero_si128();
00401009 pxor xmm0,xmm0
0040100D movdqa xmmword ptr [esp],xmm0

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧