为了能使用movdqa,我在new一个byte[]的时候应该怎么做?

Viskag 2010-08-06 10:27:47
#define ALIGN16( x ) __declspec(align(16)) x
...
...
BYTE* abc = new BYTE[1024];//在new的时候如何指定对齐ALIGN16?
...
...
--asm
{
mov esi, abc
movdqa xmm0,[esi]
...
}
...全文
96 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Viskag 2010-08-09
  • 打赏
  • 举报
回复
那我以后就用movdqu了
  • 打赏
  • 举报
回复
__declspec(align(16))不通用的,只适用于VC++。

这样定义就可以了:
__declspec(align(16)) unsigned char buf[1024];
unsigned char *pbuf = (unsigned char *)&buf;

注意这样定义保证不了16字节对齐:
__declspec(align(16)) unsigned char *buf = new unsigned char[1024];

动态分配的话,是可以写个宏来自动完成,但是释放的时候会有问题,所以就别动态分配了。

其实用movedqu就好了,不需要16字节对齐,不对齐地址访问并没有明显的性能差距,除非超过cache大小的内存访问,那样应该用movntdqa/movntdq。
zara 2010-08-06
  • 打赏
  • 举报
回复
不能确保或没有其它方法的话,就多分配个 16 字节,然后自己计算起始地址对齐到下一 16 处。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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