宏_INTSIZEOF(n)实现看不懂,求分析。

caiwei_cs 2014-03-17 08:54:58
宏_INTSIZEOF(n),它求出变量占用内存空间的大小,是va的实现的基础。
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

深入浅出VA函数
http://www.ibm.com/developerworks/cn/linux/l-va/
第三节

看不懂&~(sizeof(int) - 1) 的意思,自然也不知道这个宏的意思了。
不能直接用sizieof(n)是为了保证宏的通用性,是吧?不过这个定义就看不懂了。

求指导。
...全文
549 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiwei_cs 2014-03-18
  • 打赏
  • 举报
回复
引用 5 楼 vichare 的回复:
[quote=引用 4 楼 caiwei_cs 的回复:] [quote=引用 3 楼 vichare 的回复:] 首先,sizeof(int)肯定是2的次方数,比如32位是4,64位是8 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 的意思就是,如果sizeof(n)是sizeof(int)的倍数,则保持不变,否则返回最小的,大于sizeof(n)的,sizeof(int)的倍数。 比如,如果sizeof(int)是4,那么sizeof(n)是1-4的时候返回4,5-8的时候返回8,以此类推
谢谢了,我算了一下,虽然不知道为什么数学上能够实现这个功能,但是确实可以。[/quote] 首先sizeof(int)写成2进制是1后面若干个0,假设是n个0 sizeof(int) - 1 就是n个1, 取非再和前面的数取与就是清除掉前面那个数的后面n比特。 如果sizeof(n) 后面n比特都是0,那么加sizeof(int)-1不进位,相当于加上再清除掉。 如果sizeof(n) 后面n比特至少有1位是1,那么加了之后会往前进1,相当于sizeof(n) 右移n位,加1,再补充上n个0。[/quote] 万分感谢。!!!
vivare 2014-03-17
  • 打赏
  • 举报
回复
引用 4 楼 caiwei_cs 的回复:
[quote=引用 3 楼 vichare 的回复:] 首先,sizeof(int)肯定是2的次方数,比如32位是4,64位是8 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 的意思就是,如果sizeof(n)是sizeof(int)的倍数,则保持不变,否则返回最小的,大于sizeof(n)的,sizeof(int)的倍数。 比如,如果sizeof(int)是4,那么sizeof(n)是1-4的时候返回4,5-8的时候返回8,以此类推
谢谢了,我算了一下,虽然不知道为什么数学上能够实现这个功能,但是确实可以。[/quote] 首先sizeof(int)写成2进制是1后面若干个0,假设是n个0 sizeof(int) - 1 就是n个1, 取非再和前面的数取与就是清除掉前面那个数的后面n比特。 如果sizeof(n) 后面n比特都是0,那么加sizeof(int)-1不进位,相当于加上再清除掉。 如果sizeof(n) 后面n比特至少有1位是1,那么加了之后会往前进1,相当于sizeof(n) 右移n位,加1,再补充上n个0。
caiwei_cs 2014-03-17
  • 打赏
  • 举报
回复
引用 3 楼 vichare 的回复:
首先,sizeof(int)肯定是2的次方数,比如32位是4,64位是8 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 的意思就是,如果sizeof(n)是sizeof(int)的倍数,则保持不变,否则返回最小的,大于sizeof(n)的,sizeof(int)的倍数。 比如,如果sizeof(int)是4,那么sizeof(n)是1-4的时候返回4,5-8的时候返回8,以此类推
谢谢了,我算了一下,虽然不知道为什么数学上能够实现这个功能,但是确实可以。
vivare 2014-03-17
  • 打赏
  • 举报
回复
首先,sizeof(int)肯定是2的次方数,比如32位是4,64位是8 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 的意思就是,如果sizeof(n)是sizeof(int)的倍数,则保持不变,否则返回最小的,大于sizeof(n)的,sizeof(int)的倍数。 比如,如果sizeof(int)是4,那么sizeof(n)是1-4的时候返回4,5-8的时候返回8,以此类推
caiwei_cs 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
没细看,应该是基于int的大小进行取整,为了对齐吧。 不过,因为64位系统的出现,这个代码会是有疑问的。
是的,有这个意思,不过不明白为什么。 “这里涉及到内存对齐(alignment)问题,内存对齐跟具体使用的硬件平台有密切关系,比如大家熟知的32位x86平台规定所有的变量地址必须是4的倍数(sizeof(int) = 4)。va机制中用宏_INTSIZEOF(n)来解决这个问题,没有这些宏,va的可移植性无从谈起。”
taodm 2014-03-17
  • 打赏
  • 举报
回复
没细看,应该是基于int的大小进行取整,为了对齐吧。 不过,因为64位系统的出现,这个代码会是有疑问的。

70,012

社区成员

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

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