关于va_list的_INTSIZEOF(n)的疑问。

tianxueer 2008-07-19 10:45:49
以下是在网上查得:
在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )

这个_INTSIZEOF(n)是想获得n的大小,那么直接sizeof就可以,为什么弄得这么复杂?

不过我做了实验,(x+y)&~y,如果x从4开始,依次为8,16,32.....等,y每隔4个数,(x+y)&~y做完运算的结果和x就一样。

有高手知道为什么这么做吗?
...全文
469 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hailongchang 2008-07-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 tianxueer 的回复:]
hailongchang,刚才没细看,好像有点问题。

内存对齐我觉得是对的,但是_INTSIZEOF(n)的取值我试了还可能有12,20....这些值
[/Quote]


你说得是对的,确实可以取12,20。 并且5楼的说法更全面一些,应该是按int的倍数对齐字节。
aozhi 2008-07-19
  • 打赏
  • 举报
回复
n要是2呢,就不一样了吧。
Cpp权哥 2008-07-19
  • 打赏
  • 举报
回复
这个
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
的目的在于把sizeof(n)的结果变成至少是sizeof(int)的整倍数,这个一般用来在结构中实现按int的倍数对齐。
如果sizeof(int)是4,那么,当sizeof(n)的结果在1~4之间是,_INTSIZEOF(n)的结果会是4;当sizeof(n)的结果在5~8时,_INTSIZEOF(n)的结果会是8;当sizeof(n)的结果在9~12时,_INTSIZEOF(n)的结果会是12;……总之,会是sizeof(int)的倍数。
tianxueer 2008-07-19
  • 打赏
  • 举报
回复
hailongchang,刚才没细看,好像有点问题。

内存对齐我觉得是对的,但是_INTSIZEOF(n)的取值我试了还可能有12,20....这些值
tianxueer 2008-07-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hailongchang 的回复:]
我们知道对于IX86,sizeof(int)一定是4的整数倍,所以~(sizeof(int) - 1) )的值一定是

右面[sizeof(n)-1]/2位为0,整个这个宏也就是保证了右面[sizeof(n)-1]/2位为0,其余位置

为1,所以_INTSIZEOF(n)的值只有可能是2,4,8,16,......等等,实际上是实现了字节对齐。
[/Quote]


太牛了!
多谢了!
请问hailongchang这些都是自己悟出来的吗?还是有这方面的书籍、资料?
hailongchang 2008-07-19
  • 打赏
  • 举报
回复
我们知道对于IX86,sizeof(int)一定是4的整数倍,所以~(sizeof(int) - 1) )的值一定是

右面[sizeof(n)-1]/2位为0,整个这个宏也就是保证了右面[sizeof(n)-1]/2位为0,其余位置

为1,所以_INTSIZEOF(n)的值只有可能是2,4,8,16,......等等,实际上是实现了字节对齐。

69,382

社区成员

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

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