一段C代码的困惑,求指点

若谷 发布于 2012/12/22 22:34
阅读 805
收藏 0


#define ngx_align_ptr(p, a)                                                   \
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1)

实在是看不懂这段代码,p是u_char*, a是size_t类型,特别是该如何理解

((uintptr_t) a - 1)

以及后面的&~操作?

应用场景是

 m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);  

以last开始,计算以NGX_ALIGNMENT对齐的偏移位置指针

真心求大神帮忙指点下






加载中
1
Soga
Soga

nginx 的源码。跟你通俗点讲

其实很好理解,&~就是抹去last后面的NGX_ALIGNMENT-1位的值

这样就以NGX_ALIGNMENT对齐了,通俗点说就是NGX_ALIGNMENT的整数倍了

前面加NGX_ALIGNMENT-1就是让地址在last的后面

我这么说不知道你能不能明白,如果不明白给我留言,表达能力太水,

若谷
若谷
回复 @Soga : 搞明白了,谢谢~
Soga
Soga
回复 @若谷 : 他就是无符号整型,保证大小跟指针一样,说白了就是保证转换
若谷
若谷
还有这个操作又是何解?(uintptr_t) a - 1
若谷
若谷
uintptr_t这个是不是可以理解为指向整型的指针
0
中山野鬼
中山野鬼

这是竟然不@我 ,哈。。。。。

楼上说的基本上差不多。uintptr_t,猜都能猜出来是转成  正长整型。

我说个简单的例子。假设我的每个单元都是8个byte对齐的。那么我想知道当前一个指针地址,最近的8 byte对齐的位置,那么怎么办?


(char *)(((unsigned long long)p) & (~(7)))
这里 ,~(7)
是用来对低3位清0 ,并保持高位信息的。


那么如果我想知道,当前p如果不对齐,那么它下一个最近的,8byte对齐的地址,则可以如下设计

(char *)(((unsigned long long)p + 7) & (~(7)))
如果我想动态的对2的幂次方,如2,4,8,16,32,64的对齐进行设计,则我们就不用7,我们  如下

(char *)(((unsigned long long)p + n - 1) & (~(n - 1)))
我就说到此,你结合你的问题,和楼上的意见,再琢磨琢磨。还琢磨不出来,我就懒得对你说了。。。哈。






中山野鬼
中山野鬼
回复 @若谷 : 最近确实没空继续写书,这事情我一写就得折腾3个小时以上。不过抽空换脑子回答点问题还是可以的。
若谷
若谷
哈哈,谢谢老鬼,本来想@你老人家的,结果看到osc提问第一原则,我就默默的删除了。我仔细琢磨琢磨,你都回答这么仔细了,再看不明白,我也没脸问了
0
fromdtor
fromdtor

引用来自“Soga”的答案

nginx 的源码。跟你通俗点讲

其实很好理解,&~就是抹去last后面的NGX_ALIGNMENT-1位的值

这样就以NGX_ALIGNMENT对齐了,通俗点说就是NGX_ALIGNMENT的整数倍了

前面加NGX_ALIGNMENT-1就是让地址在last的后面

我这么说不知道你能不能明白,如果不明白给我留言,表达能力太水,

uintptr_t:
It is an unsigned int that is guaranteed to be the same size as a pointer.
Its definition is not required by C++03, but is standard in C++11.
A common reason to want an integer type that matches a pointer's size is to perform integer-specific operations on a pointer, or to obscure the type of a pointer by providing it as an integer "handle".
来自stack overflow的回答,知道他的类型,就理解了这里的一切。
若谷
若谷
非常感谢
返回顶部
顶部