关于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就一样。

有高手知道为什么这么做吗?
...全文
481 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,......等等,实际上是实现了字节对齐。
OpenCV的库文件 #pragma comment lib "cv" #pragma comment lib "highgui" #pragma comment lib "cxcore" gsl的库文件 #pragma comment lib "libgsl a" #include "minpq h" #include "sift h" #include "imgfeatures h" #include "kdtree h" #include "utils h" #include "xform h" #include <cv h> #include <cxcore h> #include <highgui h> #include <stdio h> #include <iostream h> the maximum number of keypoint NN candidates to check during BBF search #define KDTREE BBF MAX NN CHKS 200 threshold on squared ratio of distances between NN and 2nd NN #define NN SQ DIST RATIO THR 0 49 Globals char img1 file[] " 1 bmp"; 怎么VC下一个点就够了的 net下需要两个点 char img2 file[] " 2 bmp"; double imgzoom scale 0 7; 显示匹配结果图的缩放比例 IplImage img1 img2 stacked; other functions 鼠标响应函数(用于根据鼠键响应缩放匹配结果的窗口大小) void on mouse int event int x int y int flags void param ; typedef char va list; #define INTSIZEOF n sizeof n + sizeof int 1 & sizeof int 1 #define va start ap v ap va list &v + INTSIZEOF v #define va end ap ap va list 0 void fatal error char format { va list ap; fprintf stderr "Error: " ; va start ap format ; vfprintf stderr format ap ; va end ap ; fprintf stderr " n" ; abort ; } extern IplImage stack imgs IplImage img1 IplImage img2 { IplImage stacked cvCreateImage cvSize MAX img1 >width img2 >width img1 >height + img2 >height IPL DEPTH 8U 3 ; cvZero stacked ; cvSetImageROI stacked cvRect 0 0 img1 >width img1 >height ; cvAdd img1 stacked stacked NULL ; cvSetImageROI stacked cvRect 0 img1 >height img2 >width img2 >height ; cvAdd img2 stacked stacked NULL ; cvResetImageROI stacked ; return stacked; } int sift features IplImage img struct feature feat { return sift features img feat SIFT INTVLS SIFT SIGMA SIFT CONTR THR SIFT CURV THR SIFT IMG DBL SIFT DESCR WIDTH SIFT DESCR HIST BINS ; }"> OpenCV的库文件 #pragma comment lib "cv" #pragma comment lib "highgui" #pragma comment lib "cxcore" gsl的库文件 #pragma comment lib "libgsl a" #include "minpq h" #include "sift h" #include [更多]

69,432

社区成员

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

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