公告

<2007年10月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

统计

  • 随笔 - 9
  • 文章 - 13
  • 评论 - 3
  • 引用 - 0

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

offsetof 解析
 1offsetof(s,m)解析 offsetof(s,m)解析
 2 
 3今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,定义如下:
 4
 5 #define offsetof(s,m) (size_t)&(((s *)0)->m)
 6 
 7 然后到网上查了一下,发现还真的是很有用,附带一位大侠的解说:
 8
 9  struct   AAA   
10  {   
11  int   i;   
12  int   j;   
13  }
;   
14    
15  struct AAA *pAAA;   
16  pAAA=new AAA;   
17  这时,pAAA实际上是一个Pointer, 指向某一确定的内存地址,比如0x1234;   
18  而 pAAA->i 整体是一个int型变量,其地址是&(pAAA->i) ,'&'为取址运算符;   
19  那么&(pAAA->i)一定等于0x1234,因为i是结构体AAA的第一个元素。   
20  而&(pAAA->j)一定是0x1234 + 0x4 = 0x1238; 因为sizeof(int= 4;
21    
22  这个做法的巧妙之处就是:它把“0”作为上例中的pAAA,那么 &(pAAA->j)就是j的   
23  offset啦
24
25  解析结果是:   
26  (s   *)0 ,将 0 强制转换为Pointer to   "s"     
27  可以记 pS = (s *)0 ,pS是指向s的指针,它的值是0;   
28  那么pS->m就是m这个元素了,而&(pS->m)就是m的地址,而在本例中就是offset啦   
29    
30  再把结果强制转换为size_t型的就OK 了,size_t其实也就是int啦!!    
31 
32 
33

posted on 2007-10-22 16:02 blues 阅读(4190) 评论(2)  编辑 收藏 引用 所属分类: c++

评论

# re: offsetof 解析 2007-10-22 17:12 read more books

补充一下,size_t是unsigned int。
  回复  更多评论    

# re: offsetof 解析 2007-10-24 22:30 XXX

size_t并不一定是unsigned int,应该是依赖系统而typedef的,比如64位可能是uint64_t之类的

这个宏在一些老式C或C++系统里用的比较多,比如Symbian里的用来构造数组搜索用的Key的宏_FOFF就如下定义:
#define _FOFF (c, f) (((TInt)&(((c *)0x1000)->f))-0x1000)
  回复  更多评论    

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理