Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44976
  • 博文数量: 7
  • 博客积分: 740
  • 博客等级: 军士长
  • 技术积分: 190
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-28 18:06
文章分类

全部博文(7)

文章存档

2011年(1)

2008年(6)

我的朋友
最近访客

分类: C/C++

2008-10-14 17:06:29

一般情况下,需要字节对齐,特别是有的处理器强制要求字节对齐。
所谓字节对齐,就是指在内存中存储的数据,根据类型要求存放的地址需要满足某种约定。比如2字节对齐的数据i, 那么&i的值就需是2/4/6/8/这类值,而不能是1/3/等。 4字节对齐的数据就要求地址值是4/8/12等。
 进一步讲,2字节对齐就要求以二进制表示的地址值的最后一位是0,4字节对齐就要求以二进制表示的地址值的最后两位是0。
给出算法:
#define AlignTo(_ptr, _numbytes) ((void *)((Int8 *)(_ptr) + (((size_t)(_numbytes) - ((size_t)(_ptr) & (size_t)((_numbytes) - 1))) & (size_t)((_numbytes) - 1))))

(size_t)((_numbytes) - 1)就是需要对齐的最后几位(二进制),
((size_t)(_ptr) & (size_t)((_numbytes) - 1))就是该地址的最后几位。
(((size_t)(_numbytes) - ((size_t)(_ptr) & (size_t)((_numbytes) - 1))) & (size_t)((_numbytes) - 1))就是需要加的偏移量。


阅读(1596) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-12-20 18:38:49

感觉你的(Int8 *)(_ptr) 不对啊,这样后面的offset就成了8字节的偏移量了,而不是1字节的偏移量了。是不是应该改成(void *)(_ptr)? 望回复小弟一下。谢谢。QQ:48259195

chinaunix网友2008-12-20 04:13:54

也就是在写代码或者移植程序时,怎么使用?谢了

chinaunix网友2008-12-20 04:11:19

你好,我明白你的这个宏的意思,就是计算出ptr这个指针_numbytes字节对齐的地址,但是我不太知道在什么场合下使用,因为编译器会自动根据与设定的对其参数进行对齐。能告诉我什么场合下使用这个宏吗?谢谢。