对齐..

yuppy 2011-01-12 10:16:24

#define ALIGNBYTES 3
#define ALIGN(p) (((u_int)(p) + ALIGNBYTES) &~ ALIGNBYTES)


那位大哥解释下不...
...全文
153 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
碎碎念 2011-01-13
  • 打赏
  • 举报
回复
保证低两位是0...地址值是4的整数倍...32位机.地址一般都是4字节...这样比较有效率....
bluesky12312388 2011-01-13
  • 打赏
  • 举报
回复
LS的基本上都说解答完了。
某某9 2011-01-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yuppy 的回复:]

引用 7 楼 bluejays 的回复:
这个宏的目的就是为了改变指针的值吧?

首先,位运算是基础。
然后就是看别人的代码,然后自己试一些值算一下结果,再对比一下就看出规律了。

指针的值改变了之后 就不指向原先的地址了
[/Quote]
我的理解是
对奇或者不对齐
指针指向的地址会改变,但是其地址保存的值是不变的。
对齐不过是多分配些不用的空间,提高寻址的速度。
yuppy 2011-01-12
  • 打赏
  • 举报
回复
我自己测一下..3q了
yuppy 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bluejays 的回复:]
这个宏的目的就是为了改变指针的值吧?

首先,位运算是基础。
然后就是看别人的代码,然后自己试一些值算一下结果,再对比一下就看出规律了。
[/Quote]
指针的值改变了之后 就不指向原先的地址了
無_1024 2011-01-12
  • 打赏
  • 举报
回复
位运算 就是讲一个数据换成二进制之后在运算的
迷糊 2011-01-12
  • 打赏
  • 举报
回复
+1

[Quote=引用 3 楼 bluejays 的回复:]

对于32位系统,把指针对齐在4的倍数上面,地址都是32位的边界,访问效率会比较高。
[/Quote]
bluejays 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yuppy 的回复:]
值没变..

为什么这样就对齐了?
[/Quote]
这个宏是怎么用的?
如果是这样:p1 = ALIGN(p); p的值不变,得到一个向上对齐的指针p1
如果是这样:p = ALIGN(p); 就直接把p向上对齐了
bluejays 2011-01-12
  • 打赏
  • 举报
回复
这个宏的目的就是为了改变指针的值吧?

首先,位运算是基础。
然后就是看别人的代码,然后自己试一些值算一下结果,再对比一下就看出规律了。
yuppy 2011-01-12
  • 打赏
  • 举报
回复
值没变..

为什么这样就对齐了?
yuppy 2011-01-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bluejays 的回复:]
对齐的结果最低两位永远是0,结果都是4的倍数。
假定p=4,0100,p+3就是7,0111,(p+3)&(~3)就是4
假定p=5,0101,p+3就是8,1000,(p+3)&(~3)就是8
假定p=6,0110,p+3就是9,1001,(p+3)&(~3)就是8
假定p=7,0111,p+3就是10,1010,(p+3)&(~3)就是8
[/Quote]
值变了 指针的值不是改变了么?
yuppy 2011-01-12
  • 打赏
  • 举报
回复
这位兄弟~谢谢了 你这些东西是从哪里学到的 ?
bluejays 2011-01-12
  • 打赏
  • 举报
回复
对于32位系统,把指针对齐在4的倍数上面,地址都是32位的边界,访问效率会比较高。
bluejays 2011-01-12
  • 打赏
  • 举报
回复
对齐的结果最低两位永远是0,结果都是4的倍数。
假定p=4,0100,p+3就是7,0111,(p+3)&(~3)就是4
假定p=5,0101,p+3就是8,1000,(p+3)&(~3)就是8
假定p=6,0110,p+3就是9,1001,(p+3)&(~3)就是8
假定p=7,0111,p+3就是10,1010,(p+3)&(~3)就是8
bluejays 2011-01-12
  • 打赏
  • 举报
回复
(u_int)(p) 把指针p转换到u_int(应该是unsigned int)类型,这个没问题吧。
简化一下,就是 (p+3) & (~3)
3的二进制是0000....0011,也就是只有最低两位为1,前面其他位都是0
~3 是对3取反,1111....1100,也就是只有最低两位为0,前面其他位都是1
x&(~3) 任何一个数和~3做与运算,结果是把最低两位清0,前面其他位都保持不变。这就达到了对齐的效果
p+3的意思是向上对齐。如果不加3,直接p&(~3),就是向下对齐。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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