C++里面怎么让数组按16位对齐?或者说怎么让数组首地址最低位为0?

menzi11 2011-07-23 04:43:01
需要用到SSE指令来计算一些值,但是movapd比movupd要快不少,
我怎么才能控制某个new出来的数组按16位对齐呢?

网上搜了很多方法,比如:

double* p=(double*) _aligned_malloc(n,16);

再比如:

double* p=new __declspec(align(16)) double[n];


这两个里面第一种方法倒是能保证数组对齐,但为什么
用着用着就跟我说堆被破坏呢?
我用了_aligned_free(p);啊

第二种方法完全无效....查了查好像说__declspec(align(16)) 只对结构体有效??

完全蒙掉,请高手指点....
...全文
878 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
menzi11 2011-07-24
  • 打赏
  • 举报
回复
非常感谢!
16字节...我激动写错了....

char* buf = new char[n + 16];// 由于有可能分配的内存并不是16字节对齐,这里可以多分配16个 字节,这样将不对齐的分配强制对齐后,不会造成写越界
double* ptr = (double *)((int)buf + 15) & ~15);// ptr已经是16字节对齐了,并且可操作的字节数不会小于n个字节


这个太猛了!谢谢!
至善者善之敌 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lifesider 的回复:]
movapd是比movupd快,因为对齐读更快
movapd要求是的内存16字节对齐,因为操作的是XMM寄存器是128位(16字节)

分配内存时,你可以使用_aligned_malloc和_aligned_free,不过这种更容易造成碎片。至于你说的出现堆被破坏的问题,肯定是你写越界造成的,跟函数无关
其次你可以使用new[]/delete[]操作符,不过如果要使用movapd指令的话,……
[/Quote]

+++1
lifesider 2011-07-23
  • 打赏
  • 举报
回复
movapd是比movupd快,因为对齐读更快
movapd要求是的内存16字节对齐,因为操作的是XMM寄存器是128位(16字节)

分配内存时,你可以使用_aligned_malloc和_aligned_free,不过这种更容易造成碎片。至于你说的出现堆被破坏的问题,肯定是你写越界造成的,跟函数无关
其次你可以使用new[]/delete[]操作符,不过如果要使用movapd指令的话,应该先使分配的内存对齐,可以这么做

char* buf = new char[n + 16];// 由于有可能分配的内存并不是16字节对齐,这里可以多分配16个 字节,这样将不对齐的分配强制对齐后,不会造成写越界
double* ptr = (double *)((int)buf + 15) & ~15);// ptr已经是16字节对齐了,并且可操作的字节数不会小于n个字节
pengzhixi 2011-07-23
  • 打赏
  • 举报
回复
自己new出来再对齐吧。比如你要按照16对其,那么就多申请16个字节,然后将返回的地址按照16字节对其。

类似于
char *p =new char[n+16];

char*d = (char*)(((int)p+16)&(~(16-1)))
happytang 2011-07-23
  • 打赏
  • 举报
回复
是16位还是16字节
第一种没问题把,你说堆破话的打印是什么?
xiaohuh421 2011-07-23
  • 打赏
  • 举报
回复
你申请空间的时候可以自己先修正一下那个N值啊,让其是2的倍数且大于原数不就得了.


65,186

社区成员

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

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